二叉樹基本原理


二叉樹,是度為二的樹,二叉樹的每一個節點最多只有二個子節點,且兩個子節點有序。

下面開始介紹幾種常見的二叉樹類型:

1. 完全二叉樹

若設二叉樹的深度為k,除第k層外,其他各層(1~(k-1)層)的節點數都達到最大值,且第k層所有的節點都連續集中在最左邊,這樣的樹就是完全二叉樹。如圖:

Image
(圖片僅參考網友,侵刪)

完全二叉樹是一種效率很高的數據結構,而堆是一種完全二叉樹或者近似完全二叉樹,因此堆的效率也很高;像十分常用的排序算法、Dijkstra算法、Prim算法等都要用堆才能優化,二叉排序樹的效率也要借助平衡性來提高,而平衡性是基於完全二叉樹的。

(以上摘自:https://www.jianshu.com/p/6a30657bf894)

2. 滿二叉樹

滿二叉樹的定義分兩種:國內定義和國外(國際)定義。

國內定義:一個二叉樹,如果每一個層的結點數都達到最大值,則這個二叉樹就是滿二叉樹。如圖:

Image

國外(國際)定義:如果一棵二叉樹的結點要么是葉子結點,要么它有兩個子結點,這樣的樹就是滿二叉樹。(一棵滿二叉樹的每一個結點要么是葉子結點,要么它有兩個子結點,但是反過來不成立,因為完全二叉樹也滿足這個要求,但不是滿二叉樹),如圖:

Image

當然,不難看出,國外(國際)的定義已經包含了國內的定義了,也就是國內的定義是國外定義的子集。

(以上摘自:https://baike.baidu.com/item/滿二叉樹/7773283?fr=aladdin)

3. 二叉查找樹(BST)

二叉查找樹,又稱二叉排序樹,二叉搜索樹。二叉排序樹或者是一棵空樹,或者是具有下列性質的二叉樹:

  • 若左子樹不空,則左子樹上所有節點的值均小於它的根節點的值;
  • 若右子樹不空,則右子樹上所有節點的值均大於它的根節點的值;
  • 左、右子樹也分別為二叉排序樹;
  • 沒有鍵值相等的節點。

Image

4. 平衡二叉樹(AVL)

平衡二叉樹實際上也是一個二叉查找樹,但是又和二叉查找樹有所不同。平衡二叉樹包括了二叉查找樹的所有特性,但與二叉查找樹不同的是,平衡二叉樹的平衡因子不能超過1。

意思是說,要么它是一棵空樹,要么它的左子樹和右子樹都是平衡二叉樹,且左子樹和右子樹的深度之差的絕對值不超過1。

在網上找了很多關於平衡二叉樹的文章,都只闡述了以上原理,但是什么是平衡因子?下面就這點詳細的介紹一下,如圖:
Image

a樹的根節點是節點5,節點5的深度為4,所以a樹的深度為4,下面計算所有節點的平衡因子:

  1. 節點5,左子樹深度為3,右子樹深度為2,那么,節點5的平衡因子為|3-2|=1;
  2. 節點2,左子樹深度為1,右子樹深度為2,平衡因子為|1-2|=1;
  3. 節點6,無左子樹,故左子樹深度為0,右子樹深度為1,平衡因子為|0-1|=1;
  4. 節點1,無左子樹和右子樹,故左右子樹的深度均為0,平衡因子為|0-0|=0;
  5. 節點4,左子樹深度為1,無右子樹,故右子樹深度為0,平衡因子為|1-0|=1;
  6. 節點7,無左子樹和右子樹,故左右子樹的深度均為0,平衡因子為|0-0|=0;
  7. 節點3,無左子樹和右子樹,故左右子樹的深度均為0,平衡因子為|0-0|=0;

通過上述計算,得到a樹的所有節點的平衡因子,均沒有超過1,所以a樹是一個平衡二叉樹。同理計算得到b樹是一個二叉查找樹,但不是一個平衡二叉樹。

本文主要記錄了各種二叉樹的類型,接下來會專門寫幾篇文章,記錄如何通過代碼組成各種二叉樹,並且對二叉樹進行增刪查改,雖然網上有很多類似的文章,但是我還是覺得自己寫一遍,是另一種理解,感覺這是一個大工程,告訴我自己,堅持下去~~

ps:本文多是從其他地方復制的理論,結合自己的理解,可能並不是特別完整,如果有錯誤的地方,歡迎指正,謝謝~~


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM