【樹】:
1)樹是n(n>=0)個有限個資料的元素集合,形狀像一顆倒過來的樹。
2)節點:結點包含資料和指向其它節點的指標。
3)根節點:樹第乙個結點稱為根節點。
4)結點的度:結點擁有的子節點個數。
5)葉節點:沒有子節點的節點(度為0)。
6)父子節點:乙個節點father指向另乙個節點child,則child為孩子節點,father為父親節點 。
7)兄弟節點:具有相同父節點的節點互為兄弟節點。
8)節點的祖先:從根節點開始到該節點所經的所有節點都可以稱為該節點的祖先。
9)子孫:以某節點為根的子樹中任一節點都稱為該節點的子孫。
10)樹的高度:樹中距離根節點最遠節點的路徑長度
這些概念比較瑣碎,我在網上看到對樹的這些概念形象的用圖進行描述的比較好,在這裡我分享給大家:
2、樹的儲存結構:
用上圖來說明:
1)首先樹裡面肯定有值和節點,所以我們可以用結構體來儲存
struct treenode
;
2)但是樹里的節點有的是有孩子的有的是沒有的,這要怎麼來安排上面的node節點
3)於是我們可以聯想到vector容器類來進行動態的申請節點,這是一種方式
4)前幾篇中,我詳細講解了廣義表,有的同學了解的,想必已經想到可以用廣義表
5)那麼現在的我們沿襲了一種很經典的建立樹的節點的方法:引入了左孩子右兄弟
struct treenode
;
3、樹的應用:
我們可以看到,c盤就相當於根節點,下面的資料夾就是它的孩子,將其中的乙個資料夾開啟,有的為空就是葉子節點嘍。
【二叉樹】:
1、二叉樹的定義:
二叉樹是每個節點最多有兩個子樹的結構
2、二叉樹的性質:
1)二叉樹的每個結點至多只有二棵子樹(不存在度大於2的結點)
2)二叉樹的子樹有左右之分,次序不能顛倒。
3)二叉樹的第i層至多有2^個結點;
4)深度為k的二叉樹至多有2^k-1個結點;
5)對任何一棵二叉樹t,如果其終端結點數為n0,度為2的結點數為n2,則n0=n2+1。
3、二叉樹的分類:
分為完全二叉樹和滿二叉樹
1)完全二叉樹:只有最後一層的節點是不滿的,並且只能是從左到右的不滿
滿二叉樹:所有的節點都是滿的
注:因此滿二叉樹是完全二叉樹,但是完全二叉樹不一定是滿二叉樹
4、二叉樹的儲存方式:
1)靜態儲存:用陣列來表示
舉例:
上面舉得例子樹是差不多都滿的,如果是下圖這樣的樹:
這樣用陣列進行儲存的時候,我們可以看到,有很多沒有節點的,如果使用陣列的話就會造成空間的浪費。
2)動態儲存(鏈式儲存)
有兩種方式:
a:二叉鍊錶:
b:三叉鍊錶
二叉鍊錶和三叉鍊錶的區別以及用法:
**二叉鍊錶不能訪問到雙親,只能往孩子的方向進行訪問,三叉鍊錶可以訪問雙親
**三叉鍊錶浪費空間,儲存密度比二叉鍊錶低
**總的來說這兩者就有點像鍊錶和順序表,使用的是否便捷性和具體的問題有關
5、二叉樹的四種遍歷方式
1)前序遍歷:根節點-->左子樹-->右子樹
2)中序遍歷:左子樹-->根節點-->右子樹
3)後序遍歷:左子樹-->右子樹-->根節點
4)層序遍歷:一層一層的遍歷
下面我來舉個例子:
a:前序遍歷的結果是:1,2,3,4,5,6
b:中序遍歷的結果是: 3,2,4,1,6,5
c:後序遍歷的結果是:3,4,2,6,5,1
d:層序遍歷的結果是:1,2,5,3,4,6
資料結構 二叉樹 反轉二叉樹
include using namespace std define maxsize 1000 struct binary tree node class queue queue queue void queue push binary tree node btn binary tree node ...
資料結構筆記 樹 二叉樹 滿二叉樹
二叉樹滿二叉樹 樹是n n 0 個結點的有限集。結點為零的樹為空樹。任意一棵非空樹中 1.有且有乙個特定的稱為根的結點 2.當n 1時,其餘結點可分為m m 0 個互不相交的有限集,其中每乙個集合又是一棵樹,並稱為根的子樹。1.結點擁有的子樹數稱為結點的度 2.度為0的結點稱為葉結點或分支結點,除根...
資料結構 樹結構 二叉樹 完全二叉樹 滿二叉樹
樹結構是一種描述非線性層次關係的資料結構。除根結點外,其餘每個結點有且僅有乙個直接前驅。每個結點可以有任意多個直接後繼。英文名詞表示 tree,root,node,leaf,edge,child,subtree 要麼二叉樹沒有根結點,是一棵空樹。要麼二叉樹由根結點,左子樹,右子樹組成,且左子樹和右子...