1.樹的定義:
樹(Tree)是n(n>=0)個結點的有限集。n=0時稱爲空樹。在n>0時,在任意一顆非空的樹中
- 有且僅有一個特定的稱爲根(Root)的結點,它沒有直接前驅,但有零個或多個直接後驅;
- 當n>1時,其餘結點可分爲m(m>0)個互不相交的有限集.....,其中每一個集合本身又是一棵樹,並且稱爲根的子樹(SubTree),每個子樹的根節點有且只有一個直接前驅,但有零個或多個直接後驅;
結點的概念
- 結點 :包含一個數據元素及若干指向其他結點的分支。
- 結點的度:一個結點的子樹個數。
- 分支結點:度不爲0的結點,又稱非終端結點
- 終端結點:度爲0都結點,又稱葉結點
- 結點的層次:從根開始,根爲第一層,根的子結點爲第二層,以此類推。
- 結點之間的關係:結點的子樹的根稱爲該結點的孩子,相應地,該結點稱爲孩子的雙親結點。同一個雙親的孩子之間互稱兄弟結點。結點的祖先是從根到該結點所經分支上的所有結點。對於上圖 H來說 E,B,A都是它的祖先。反之,以某結點爲根的子樹的任一結點都是該結點的子孫。
樹的概念
- 樹的度:樹內所有結點的度的最大值。
- 樹的高度:樹中結點層次的最大值爲樹的深度或高度。比如上圖的高度就是4.
- 有序樹:將樹中各子樹看成從左到右是有次序的,不能互換的,則稱該樹爲有序樹,否則是無序樹。
-
森林:m(m>=0)顆互不相交的樹的集合,對樹中的每個結點而言,其子樹的集合即爲森林。
線性結構 | 樹結構 |
---|---|
第一個數據元素:無前驅 | 根節點:無雙親,唯一 |
最後一個數據元素:無後驅 | 葉結點:無孩子,可以多個 |
中間元素:一個前驅一個後驅 | 中間結點:一個雙親多個孩子 |
2.二叉樹的定義:
- 每個結點的度都不大於2
- 每個結點的孩子結點次序不能任意顛倒
由此得出:二叉樹的每個結點0、1或2個子樹,且有左右之分,左邊的是左子樹,右邊的是右子樹
二叉樹有五種基本形態
- 空二叉樹
- 只有一個根結點
- 根結點只有左子樹
- 根結點只有右子樹
- 根結點既有左子樹又有右子樹
特殊二叉樹
- 斜樹:每層只有一個結點
- 滿二叉樹:所有的分支結點都存在左子樹和右子樹,並且所有的葉子都在同一層上
- 完全二叉樹:按照滿二叉樹的順序而出現,中間沒有空隙
左斜樹和右斜樹
滿二叉樹和完全二叉樹
二叉樹的性質
- 在二叉樹的第i層上至多有個結點(i>=1)
- 深度爲k的二叉樹至多有-1個結點(k>=1)
- 對任何一顆二叉樹T,如果其終端結點數爲,度爲2的結點數爲,則=+1
- 具有n個結點的完全二叉樹的深度爲()+1
- 對於一顆有n個結點的完全二叉樹 ,對於任意結點有: 1.如果i=1,則i是二叉樹的根,無雙親;如果i>1,則其雙親是結點(i/2); 2.如果2i>n,則結點i無左子樹;否則其左子樹是結點2i; 3.如果2i+1>n。則結點i無左右子樹;否則其右子樹是結點2i+1;
3.二叉樹的存儲結構
1.順序存儲結構
二叉樹之間是有順序的,所有數組的下標足夠提醒二叉樹之間的順序關係,結點爲空的設置一個不存在的值就可以了,但是比如下圖的情況的話,空白的結點都要佔用存儲空間,所以順序存儲結構一般只適用於完全二叉樹。
2.二叉樹的鏈式存儲結構
二叉樹的每個結點最多有兩個孩子,所以爲它設計一個數據域和兩個指針域是比較自然的想法,我們稱這樣的鏈表叫做二叉鏈表。(如果有需要,還可以加上指向雙親的指針域,那樣稱爲三叉鏈表)
lchild | data | rchild |
data是數據域,lchild和rchild都是指針域,分別存放左子樹和右子樹的指針。
4.遍歷二叉樹
二叉樹的遍歷是指從根結點出發,按照某種次序依次訪問二叉樹中的所有結點,使得每個結點被訪問且僅被訪問一次。
二叉樹的遍歷方法
- 前序遍歷 :若二叉樹爲空,則空操作返回,否則先訪問根結點,然後前序遍歷左子樹,再前序遍歷右子樹;例順序爲:ABDGHCEIG
- 中序遍歷:若二叉樹爲空,則空操作返回,否則從根結點開始,中序遍歷根結點的左子樹,然後訪問根結點,最後中序遍歷右子樹;例順序爲:GDHBAEICF
- 後序遍歷:若二叉樹爲空,則空操作返回,否則從左到右先葉子後結點的方式遍歷訪問左右子樹,最後訪問根結點;例順序爲:GHDBIEFCA
- 層序遍歷:若二叉樹爲空,則空操作返回,否則先訪問根結點,然後從上而下逐層遍歷,同一層按從左到右的順序對結點逐個訪問;例順序爲:ABCDEFGHI
說得再多關看文章或視頻是不能完全理解應用樹的結構的,還是要多刷一下算法題,才能更深一步的理解