「樹」是有乙個或乙個以上的節點組成,存在乙個特殊的節點,稱為樹根。每個節點是一些資料和指標組合而成的記錄。除了樹根,其餘節點可分為n>=0個互斥的集合,其中每乙個子集合本身也是一種樹狀結構,即此根節點的子樹。此外一棵合法的樹,節點間可以互相連線,但不能形成無出口的迴路。
度數:每個節點所有子樹的個數。
層數:樹的層數。
高度:輸的最大層數
樹葉或稱終端節點:度數為零的節點就是樹葉。
祖先和子孫:祖先是指從樹根到該節點路徑上所包含的節點,而子孫是在該節點往下追溯子樹中的任一節點。
兄弟節點:有共同父節點的節點。
非終端節點:樹葉以外的節點。
同代:在同一棵中具有相同層數的節點。
二叉樹的特性:
1. 層數為i的樹,他的節點數最多是2i
−1(i
>=0)
. 2. 度數為k的二叉樹總節點數是2k
−1.
3. 對於任何非空二叉樹t,如果n0
為樹葉節點數,且度數為2的節點數是n2
,則有n0
=n2−
1 4. 高度為k的二叉樹,總結點對少為k.
特殊二叉樹
完全二叉樹:
如果二叉樹的高度為h,所含的節點數小於2h
−1,但其節點的編號方式如同高度為h的滿二叉樹一樣,從左到右,從上到下的順序一一對應。
嚴格二叉樹:
二叉樹中每乙個非終端節點均有非空的左右子樹。
二叉樹的儲存方式有很多,一般在資料結構的領域中習慣用鍊錶來表示二叉樹組織。用一位陣列來表示時對樹中間節點進行插入刪除操作時,需要大量移動來反應節點的變動。
一維陣列表式法
使用有序的一維陣列來表示二叉樹,首先可將此二叉樹假想為一棵滿二叉樹,而且第k層具有2k-1個節點,他們按序存放在這個一維陣列中。
煉表表式法
由於二叉樹最多只能有兩個子節點,就是度數小魚或等於2,而所謂煉表表式法,就是利用鍊錶來儲存二叉樹。就是運用動態分配記憶體的指標的方式來建立二叉樹。
是用鍊錶來表示二叉樹的好處是節點的增加和刪除操作相當容易,缺點是很難找到父節點,除非每一節點增加乙個指向父節點的指標。
前序遍歷:
是一種」中左右「的遍歷順序,也就是先從根節點遍歷,再往左方移動,當無法繼續時,繼續向右方移動,接著再重複執行此步驟。
中序遍歷:
是左中右的遍歷順序,也就是從樹的左側逐步向下方移動,知道無法移動,在訪問此節點,並向右移動乙個節點。如果無法再向右移動時,可以返回上層父節點,後右子樹。
後序遍歷:
後序遍歷是左右中的遍歷順序,就是先遍歷左子樹,在便利右子樹,最後遍歷根節點,反覆執行此步驟。
二叉樹的儲存方式,節點儲存空間的浪費率可以從2/3降到1/2,對於一棵有n個節點的二叉樹,實際上用來指向左右兩節點的指標只有n-1個鏈結,另外的n+1個指標都是空連線。
所謂線索二叉樹就是把這些空的鏈結加以利用,再指到樹的其他節點,這些鏈結就稱為線索。
資料結構 樹狀陣列
區間資訊的維護與查詢專題 樹狀陣列 1.問題 動態連續和查詢問題。給定乙個n個元素的陣列a1,a2,an,你的任務是設計乙個資料結構,支援以下兩種操作。add x,d 操作 讓ax增加d.query l,r 計算al al 1 ar.對普通陣列進行 一次修改或 特定區間 求和,時間複雜度為o n n...
資料結構 樹狀陣列
原陣列 字首和 範圍和 原陣列更改陣列元素在求和效率較低,引入樹狀陣列 假設原陣列a 樹狀陣列c 樹狀陣列 的三種操作 1.lowbit 子葉數 二進位制最低位的1代表多少 實現 int lowbit int n 求 lowbit x returnx x 2.update a i k 假設a i 是...
資料結構 樹狀陣列
講到了線段樹,那就順便講講樹狀陣列吧。假設乙個長度為 12 的線段樹,構建結果如下 在區間求和問題上,在葉子節點,顯然劃線部分的值可以由父親節點 左端葉子節點得到。那麼,這部分資訊就是冗餘的,沒有儲存的必要。同理,可以推導出所有冗餘的部分如下 那麼,去除冗餘部分後的結果如下 給每乙個節點乙個編號。我...