樹是n(n≥0)個結點的有限集。在任意一棵非空樹中:數組
(2)當n>1時,其他結點可分爲m(m>0)個互不相交的有限集T1,T2,…,Tm,其中每個集合自己又是一棵樹,而且稱爲根的子樹。指針
樹做爲一種邏輯結構,顯然是一種遞歸的結構,同時也是一種分層結構。
性質:
一、n個結點的樹中有n-1條邊
二、樹中結點數等於全部結點度數加1
三、度爲m的樹中第i層上至多有m
i-1個結點(i>=1)(即算做每一個結點的度爲m,這樣多一層便多一次方倍(除去第一層根結點因此-1))
四、高度爲h的m叉樹至多有(m
h-1)(m-1)個結點。(m
h+m
h-1+...+m+1=(m
h-1)(m-1))
五、具備n個結點的m叉樹的最小高度爲 log
m
(n(m-1)+1) (推理不出,死記)
基本操做:
插入類:初始化置空、按定義建立、結點賦值、插入樹做爲子樹
刪除類:樹清空、銷燬結構、刪除結點的子樹
查找類:根結點、當前結點、當前結點雙親結點、當前節點左/右子節點、當前節點最左/右子結點、、判空、求深、遍歷
二叉樹
特殊二叉樹:滿二叉樹、徹底二叉樹、二叉排序樹、平衡二叉樹
性質:
一、二叉樹上子結點數等於度爲2的結點數加1
二、1)二叉樹的第 i 層上至多有
個結點
2)深度爲 k 的二叉樹上至多含
個結點
四、1)具備 n 個結點的徹底二叉樹的深度爲
2)結點 i 所在的深度爲log
2
i+1。
五、徹底二叉樹標上順序編號,則對其中任意一個編號爲 i 的結點:
1)若 i=1,則該結點是二叉樹的根無雙親,不然有雙親,偶爲左子奇爲右子,編號 i/2 或 (i-1)/2 的結點分別爲雙親結點;
2)若2i>N或2i+1>N,i分別無左子或右子,不然結點 i 的左子爲2i或右子爲2i+1;
順序存儲結構
適用滿二叉樹和徹底二叉樹,對於通常二叉樹就用0來表示沒有結點的位置
注意:數組下標從1開始,二叉樹的順序存儲與樹的順序存儲之間關係
鏈式存儲結構
二叉樹遍歷
二叉樹的應用是在遍歷爲基礎上,進行查找、添加、刪除,與線性表的應用的分類上不大同樣。
前序遍歷 中序遍歷 後序遍歷
非遞歸遍歷:非遞歸遍歷(棧) 層次遍歷(隊列)
應用:輸入結點值,構造二叉樹 (先序遍歷) 統計二叉樹中葉子結點的個數 (先序遍歷) 求二叉樹的深度 (後序遍歷)
線索二叉樹
二叉樹的指針域是結點數的2倍,n個結點的二叉樹有2n個指針域,有n-1條邊(除了根結點外每一個結點都有一條邊指向),即有n-1個含邊的非空指針域,由此空指針域可由指針域與非空指針域作差獲得:2n-(n-1)=n+1 個,且存在於葉結點。
利用這些空結點一方面避免存儲資源浪費,更重要的另外一方面,在二叉樹鏈表上僅知道每一個結點的左右子,若每次想知道某結點前驅後繼就須要遍歷一次,利用這些空指針域作線索化就能將二叉樹
轉化爲一個雙向鏈表,對查找、插入、刪除結點帶來了方便。
爲此增設兩個標誌域ltag和rtag存放bool值(佔內存小於指針變量lchild和rchild)。
樹、森林
樹的存儲結構:
雙親表示法(帶指針域的數組,每一個元素(結點)指針域指向本身的雙親結點)、
便於尋找結點雙親,尋找子女需遍歷
孩子表示法(在雙親表示法基礎上,將指針域改成指向本身的子結點,而且被指向的結點具備一樣結構,一樣地其指針域一樣指向本身子結點,這樣就造成了自上而下的鏈表,第一列爲頭結點,沒有子結點的結點指向NULL)、
便於尋找結點子女,尋找雙親需遍歷
以上兩種方法能夠合二爲一
孩子兄弟表示法(二叉樹結點鏈,只不過左指針指向左邊第一個孩子,右指針指向本身的右邊下一個兄弟,從根結點開始)、
方便轉化爲二叉樹,易於查找結點子女,缺點是難找雙親,能夠每一個結點加一個parent域指向其雙親來解決
樹、森林與二叉樹的轉化
1.孩子兄弟法使森林中每棵樹—>二叉樹。2.以第一棵樹的二叉樹做爲根結點樹,而後依次接上左子
孩子兄弟表示法能夠將普通樹轉化成二叉樹存儲,在實際操做中,能夠應用二叉樹的性質來解決普通樹或者森林的問題。
樹的應用—並查集