二叉树的基本概念以及基本操作
?前言?
之前的學習中,我們學習過棧與隊列,本次我們將繼續往下學習,今天主要學習內容主要是二叉樹,了解并掌握二叉樹的基本性質,如何去使用二叉樹!
📘 博客主頁:to Keep博客主頁
🙆歡迎關注,👍點贊,📝留言評論
?首發時間:2022年1月14日
📨 博主碼云地址:博主碼云地址
📕參考書籍:java核心技術 卷1
📢編程練習:牛客網+力扣網
由于博主目前也是處于一個學習的狀態,如有講的不對的地方,請一定聯系我予以改正!!!
文章目錄
- 1 樹有關的術語
- 2 樹的表示形式
- 3 二叉樹(重點)
- 3.1 概念
- 3.2 二叉樹的基本形態
- 3.3 滿二叉樹與完全二叉樹
- 3.4 二叉樹的性質
- 4 遞歸實現前中后序遍歷
- 4.1 前序遍歷
- 4.2 中序遍歷
- 4.3 后序遍歷
- 5 非遞歸實現前中后序的遍歷
- 5.1 前序遍歷
- 5.2 中序遍歷
- 5.3 后序遍歷
1 樹有關的術語
節點的度:一個節點含有的子樹的個數稱為該節點的度;通俗來理解就是數一數A有幾條邊。 如上圖:A的為6
樹的度:一棵樹中,最大的節點的度稱為樹的度; 如上圖:樹的度為6
葉子節點或終端節點:度為0的節點稱為葉節點; 如上圖:B、C、H、I…等節點為葉節點
雙親節點或父節點:若一個節點含有子節點,則這個節點稱為其子節點的父節點; 如上圖:A是B的父節點
孩子節點或子節點:一個節點含有的子樹的根節點稱為該節點的子節點; 如上圖:B是A的孩子節點
根結點:一棵樹中,沒有雙親結點的結點;如上圖:A
節點的層次:從根開始定義起,根為第1層,根的子節點為第2層,以此類推
樹的高度或深度:樹中節點的最大層次; 如上圖:樹的高度為4
非終端節點或分支節點(了解即可):度不為0的節點; 如上圖:D、E、F、G…等節點為分支節點
兄弟節點(了解即可):具有相同父節點的節點互稱為兄弟節點; 如上圖:B、C是兄弟節點
堂兄弟節點(了解即可):雙親在同一層的節點互為堂兄弟;如上圖:H、I互為兄弟節點
節點的祖先(了解即可):從根到該節點所經分支上的所有節點;如上圖:A是所有節點的祖先
子孫(了解即可):以某節點為根的子樹中任一節點都稱為該節點的子孫。如上圖:所有節點都是A的子孫
森林(了解即可):由m(m>=0)棵互不相交的樹的集合稱為森林
2 樹的表示形式
樹結構相對線性表就比較復雜了,要存儲表示起來就比較麻煩了,實際中樹有很多種表示方式,如:雙親表示法,孩子表示法、孩子兄弟表示法等等。我們這里就簡單的了解其中最常用的孩子兄弟表示法。
class Node {int value; // 樹中存儲的數據Node firstChild; // 第一個孩子引用Node nextBrother; // 下一個兄弟引用 }3 二叉樹(重點)
3.1 概念
一棵二叉樹是結點的一個有限集合,該集合或者為空,或者是由一個根節點加上兩棵別稱為左子樹和右子樹的二叉樹組成。
二叉樹的特點:
1). 每個結點最多有兩棵子樹,即二叉樹不存在度大于 2 的結點。
2). 二叉樹的子樹有左右之分,其子樹的次序不能顛倒,因此二叉樹是有序樹。
3.2 二叉樹的基本形態
3.3 滿二叉樹與完全二叉樹
滿二叉樹: 一個二叉樹,如果每一個層的結點數都達到最大值,則這個二叉樹就是滿二叉樹。也就是說,如果一個二叉樹的層數為K,且結點總數是 2的k次方減1,則它就是滿二叉樹。
完全二叉樹:一棵深度為k的有n個結點的 二叉樹 ,對樹中的結點按從上至下、從左到右的順序進行編號,如果編號為i(1≤i≤n)的結點與 滿二叉樹 中編號為i的結點在滿二叉樹中的位置相同,則這棵二叉樹稱為完全二叉樹。
不是完全二叉樹:
通過與滿二叉樹節點所在位置進行對比,發現位置不能一一對應,故不屬于完全二叉樹
3.4 二叉樹的性質
1). 若規定根節點的層數為1,則一棵非空二叉樹的第i層上最多有2的k-1次方 (i>0)個結點
2). 若規定只有根節點的二叉樹的深度為1,則深度為K的二叉樹的最大結點數是 2的k次方減1(k>=0)
3). 對任何一棵二叉樹, 如果其葉結點個數為 n0, 度為2的非葉結點個數為 n2,則有n0=n2+1
4). 具有n個結點的完全二叉樹的深度k為 log以2為底n+1為對數上取整
5). 對于具有n個結點的完全二叉樹,如果按照從上至下從左至右的順序對所有節點從0開始編號,則對于序號為i的結點有:
若i>0,雙親序號:(i-1)/2;i=0,i為根節點編號,無雙親節點
若2i+1<n,左孩子序號:2i+1,否則無左孩子
若2i+2<n,右孩子序號:2i+2,否則無右孩子
4 遞歸實現前中后序遍歷
4.1 前序遍歷
//前序遍歷public void preOrderTraversal(Node root){if(root!=null){//先遍歷根節點的值System.out.print(root.val);//遍歷左節點的值postOrderTraversal(root.left);//遍歷右節點的值postOrderTraversal(root.right);}}4.2 中序遍歷
// 中序遍歷public void inOrderTraversal(Node root){if(root!=null){//先利用遞歸遍歷左節點inOrderTraversal(root.left);//遍歷根節點System.out.print(root.val);//遍歷右節點inOrderTraversal(root.right);}}4.3 后序遍歷
// 后序遍歷public void postOrderTraversal(Node root){if (root!=null){//先遍歷左節點postOrderTraversal(root.left);//遍歷右節點postOrderTraversal(root.right);//遍歷根節點System.out.print(root.val);}}5 非遞歸實現前中后序的遍歷
5.1 前序遍歷
//非遞歸的前序遍歷(根節點->左節點->右節點)public void noRecussivepreOrderTraversal(Node root){Stack<Node> stack = new Stack<>();//棧用來存放接節點Node cur;//指向當前節點//在頭結點不為空的情況下,先將頭結點進行入棧操作if (root!=null){stack.push(root);}//棧為空的循環while(!stack.isEmpty()){cur= stack.pop();//指向當前棧頂的節點,進行出棧System.out.print(cur.val);//打印節點值if (cur.right!=null){stack.push(cur);//根據棧的特性。后進先出,先判斷當前節點的右子樹是否為空,進行進棧處理}if (cur.left!=null){stack.push(cur);//判斷當前節點的左子樹是否為空,進行進棧處理}}System.out.println();//換行操作} }5.2 中序遍歷
//非遞歸的中序遍歷public void noRecussiveinOrderTraversal(Node root){Stack<Node> stack = new Stack<>();Node cur = root;while(cur!=null){//將最左邊的節點依次進棧stack.push(cur);cur=cur.left;}while(!stack.isEmpty()){//利用棧處理當前節點的左右子樹cur=stack.pop();//取得棧頂的元素System.out.print(cur.val);if (cur.right!=null){//處理右子樹cur=cur.right;while(cur!=null){stack.push(cur);cur=cur.left;}}}} }5.3 后序遍歷
//非遞歸的后序遍歷public void RecusivepostTraversal(Node root){Stack<Node> stack = new Stack<>();Node cur=root;//表示當前的節點Node prve=null;//表示已經遍歷過的節點while(cur!=null){while(cur.left!=null){stack.push(cur);cur=cur.left;}while(cur!=null&&(cur.right==null||cur.right==prve)){System.out.print(cur.val);prve=cur;cur=stack.pop();if (stack.isEmpty()){return;}}stack.push(cur);cur=cur.right;}}總結
以上是生活随笔為你收集整理的二叉树的基本概念以及基本操作的全部內容,希望文章能夠幫你解決所遇到的問題。