資料結構學習筆記 二叉樹

2021-10-18 02:58:02 字數 1708 閱讀 5318

樹, 非線性表結構

樹有三個概念:

高度從下向上數, 起點是0

深度從上向下數, 起點是0

層數從上向下數, 起點是1

每個節點最多兩個叉

有兩種特殊二叉樹:

滿二叉樹, 除了葉子節點, 每個節點都有左右兩個子節點

完全二叉樹, 葉子節點都在最底下兩層, 最後一層葉子節點都靠左排列, 且除了最後一層, 其它層節點個數都達到最大

滿二叉樹是完全二叉樹的一種特殊情況

基於指標的二叉鏈式儲存法

每個節點三個字段, 乙個存資料, 另外兩個存左右子節點的指標, 這種方式比較常用, 大部分二叉樹**都是通過這種結構來實現的

基於陣列的順序儲存法

把根節點儲存在i=1的位置, 左子節點存在2i的位置, 右子節點儲存在2i+1的位置, 以此類推

此種儲存方式, 是完全二叉樹的話, 只浪費乙個下標0的儲存位置, 非完全二叉樹的話, 會浪費更多的陣列儲存空間

所以乙個樹是完全二叉樹的話, 用陣列儲存是最節省記憶體的一種方式, 也是為什麼完全二叉樹被單拎出來說明的原因.

堆其實就是一種完全二叉樹, 最常用的儲存方式就是陣列

如何列印所有節點, 經典方法有三種:

前序遍歷, 對於樹中的任意節點來說, 先列印這個節點, 再列印左子樹, 最後列印右子樹 (todo)

中序遍歷, 對於樹中的任意節點來說, 先列印左子樹, 再列印本身, 最後列印右子樹 (todo)

後序遍歷, 對於樹中的任意節點來說, 先列印左子樹, 再列印右子樹, 最後列印它本身 (todo)

實際上二叉樹的三種遍歷, 就是乙個遞迴的過程

遍歷的時間複雜度是o(n)

不常用的遍歷, 按層遍歷 (todo)

也叫二叉搜尋樹

特點, 支援動態資料集合的快速插入刪除, 查詢操作

二叉查詢樹要求, 在樹的任意乙個節點, 其左子樹中的每個節點的值, 都要小於這個節點的值, 而右子樹節點的值, 都大於這個節點的值

查詢操作

先取根節點, 等於就返回, 比根節點小就在左子樹遞迴查詢, 比根節點大就在右子樹遞迴查詢

插入操作

新插入的資料一般在葉子節點上, 類似查詢操作, 從根節點開始比較, 如果要插入資料比節點大, 並且節點的右子樹為空, 則直接插到右子節點位置, 如果不為空, 再遞迴遍歷右子樹找位置, 如果資料比節點小, 同理遍歷左子樹查詢位置

刪除操作

相對複雜, 分為三種情況

第一種, 要刪除節點沒有子節點, 直接將父節點指標置為null

第二種, 要刪除節點有乙個子節點, 更新父節點指標指向要刪除節點的子節點

第三種, 要刪除的節點有兩個子節點, 需要找到右子樹中的最小節點, 替換到要刪除的節點上, 然後刪除掉這個最小節點

其他操作

二叉查詢樹還支援快速的查詢最大節點和最小節點, 前驅節點和後繼節點

重要特性, 中序遍歷二叉查詢樹, 可以輸出有序的資料序列, 時間複雜度o(n), 非常高效

支援重複資料的二叉查詢樹

二叉查詢樹的時間複雜度

不同形態的二叉查詢樹時間複雜度不同, 時間複雜度和樹的高度成正比, 也就是o(height)

資料結構學習(1) 二叉樹

二叉樹結構 public class treenode 前序遍歷 根結點,左子樹,右子樹 public static void prenode treenode node,listtreelist 中序遍歷 左子樹,根結點,右子樹 public static void midnode treenod...

資料結構學習之二叉樹

一 為什麼用二叉樹,而不是三個指標域或是根據實際情況指定指標域?比如3,那麼有n個節點就是有3n個指標域,其中邊只有n條,那麼只有n 1個域非空,有2n 1個域為空,浪費空間。而對於2,那麼就只有n 1個域為空。而比如說根據實際來確定指標域,對於實現上是非常困難的。度為2的樹就是二叉樹。斜二叉樹 完...

資料結構學習筆記11 樹與二叉樹

1.樹的定義 樹是n個結點的有限集。在任意一顆非空樹中應滿足 1 有且僅有乙個特定的稱為根 root 的結點 2 當n 1時,其餘結點可分為m m 0 個互不相交的有限集,其中每乙個集合本身又是一棵樹,並且稱為根的子樹。每棵子樹的根節點有且僅有乙個直接前驅,但可以有0個或多個直接後繼。由此可以看到,...