二叉樹的分類


滿二叉樹

  通過名字就可以看出來是一個滿的二叉樹,意思也就是二叉樹上每一層的結點數都達到了最大。看上去就像上個三角形。

                                                                   

  滿二叉樹必須滿足:

    1.總的結點個數2k-1個結點; 如上圖是一個3層的二叉樹,總的結點個數為23-1=7個點節

    2.第i層的結點個數數為2k-1個結點;如上圖第3層的結點個數為23-1=4個結點

    3.具有n個節點的滿二叉樹的深度為log2(n+1),如上圖節點數為7,log2(7+1)=3,深度為3。

完全二叉樹

  和滿二叉樹不同的是最后一層不是滿的,除了最了一層,其余的k-1層是一個滿二叉樹,最后一層的結點是從左開始排列的。(滿二叉樹是特殊的完全二叉樹,但完全二叉樹不一定是滿二叉樹)

                  

  完全二叉樹必須滿足:

    1.某個節點沒有左子節點,那么肯定也不能有右子節點

    2.從第1層到第k-1層是一個滿二叉樹,最后一層的結點從左開始排列。

二叉查找樹

  二叉查找樹(Binary Search Tree),(又:二叉搜索樹,二叉排序樹)它或者是一棵空樹,或者是具有下列性質的二叉樹: 若它的左子樹不空,則左子樹上所有結點的值均小於它的根結點的值; 若它的右子樹不空,則右子樹上所有結點的值均大於它的根結點的值; 它的左、右子樹也分別為二叉排序樹。

                              

                      最優                    最壞 

  二叉查找樹必須滿足:

    1.所有子樹上面的左節點的值都比根結點要小,右節點的值都比根結點要大 

    2.任意結點的左右子樹也都是二叉查找樹

    3.通過中序遍歷,將得到的是一個有序的數列

  對其操作的最優的時間復雜度為O(log2n),相當於對數列進行二分查找法。最壞的時間復雜度為O(n),相當於線性查找。

平衡二叉樹

  平衡二叉樹(Balanced Binary Tree)又被稱為AVL樹(有別於AVL算法),它是二叉查找樹最優的情況。它很好的解決了二叉查找樹退化成鏈表的問題,把插入,查找,刪除的時間復雜度最好情況和最壞情況都維持在O(logN)。但是頻繁旋轉會使插入和刪除犧牲掉O(logN)左右的時間,不過相對二叉查找樹來說,時間上穩定了很多。

                                                         

  且具有以下性質:

    1.它是一個二叉查找樹

    2.它的左右兩個子樹的高度差的絕對值不超過1,並且左右兩個子樹都是一棵平衡二叉樹。

    3.當刪除、新增、修改節點上的值時,它會通過左旋或右旋的操作使二叉樹保持平衡。

    4.最壞的時間復雜度為O(log2n)

  如果對左旋和右旋操作不了解的可以看:https://www.cnblogs.com/zhangbaochong/p/5164994.html ,一些操作很詳細。

紅黑樹  

  它是一種二叉查找樹,但在每個節點增加一個存儲位表示節點的顏色,可以是紅或黑(非紅即黑)。通過對任何一條從根到葉子的路徑上各個節點着色的方式的限制,紅黑樹確保沒有一條路徑會比其它路徑長出兩倍(這里是和平衡二叉樹的主要區別),因此,紅黑樹是一種弱平衡二叉樹(由於是弱平衡,可以看到,在相同的節點情況下,AVL樹的高度低於紅黑樹),相對於要求嚴格的AVL樹來說,它的旋轉次數少,所以對於搜索,插入,刪除操作較多的情況下,我們就用紅黑樹。如果應用場景中對插入刪除不頻繁,只是對查找要求較高,那么AVL還是較優於紅黑樹。

  更詳細的紅黑樹介紹:https://www.cnblogs.com/skywang12345/p/3245399.html

                                                     

  紅黑樹與平衡二叉樹的區別:

1、紅黑樹放棄了追求完全平衡,追求大致平衡,在與平衡二叉樹的時間復雜度相差不大的情況下,保證每次插入最多只需要三次旋轉就能達到平衡,實現起來也更為簡單。
2、平衡二叉樹追求絕對平衡,條件比較苛刻,實現起來比較麻煩,每次插入新節點之后需要旋轉的次數不能預知。

3、紅黑樹和AVL樹的區別在於它使用顏色來標識結點的高度,它所追求的是局部平衡而不是AVL樹中的非常嚴格的平衡。
4、紅黑樹是犧牲了嚴格的高度平衡的優越條件為代價紅黑樹能夠以O(log2 n)的時間復雜度進行搜索、插入、刪除操作。
5、紅黑樹的算法時間復雜度和AVL相同,但統計性能比AVL樹更高.

二叉樹遍歷

分為三種:前序、中序、后序,其中序遍歷最為重要。為啥叫這個名字?是根據根節點的順序命名的。

比如上圖正常的一個滿節點,A:根節點、B:左節點、C:右節點,前序順序是ABC(根節點排最先,然后同級先左后右);中序順序是BAC(先左后根最后右);后序順序是BCA(先左后右最后根)。

    

比如上圖二叉樹遍歷結果

    前序遍歷:ABCDEFGHK

    中序遍歷:BDCAEHGKF

    后序遍歷:DCBHKGFEA

分析中序遍歷如下圖,中序比較重要(java很多樹排序是基於中序,后面講解分析)

 


免責聲明!

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



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