二叉樹

二叉樹

在計算機科學中,二叉樹是每個節點最多有兩個子樹的樹結構。通常子樹被稱作“左子樹”(left subtree)和“右子樹”(right subtree)。

二叉樹的每個結點至多隻有二棵子樹(不存在度大於2的結點),二叉樹的子樹有左右之分,次序不能顛倒。二叉樹常被用於實現二叉查找樹和二叉堆。

二叉樹的第i層至多有2^(i-1)個結點;

深度爲k的二叉樹至多有2^k-1個結點;(等比數列1+2+4+…+2^(k-1) = 2^k-1)。

對任何一棵二叉樹T,如果其終端結點數爲n0,度爲2的結點數爲n2,則n0 = n2 + 1。

樹和二叉樹的三個主要差別:

1)  樹的結點個數至少爲1,而二叉樹的結點個數可以爲0;

2)  樹中結點的最大度數沒有限制,而二叉樹結點的最大度數爲2;

3)  樹的結點無左、右之分,而二叉樹的結點有左、右之分。

遍歷

前序遍歷:
1.訪問根節點 
2.前序遍歷左子樹 
3.前序遍歷右子樹

中序遍歷:
1.中序遍歷左子樹 
2.訪問根節點 
3.中序遍歷右子樹

後序遍歷:
1.後序遍歷左子樹 
2.後序遍歷右子樹 
3.訪問根節點
 

滿二叉樹

一棵深度爲k,且有2^k-1個節點的樹是滿二叉樹。

另一種定義:除了葉結點外每一個結點都有左右子葉且葉子結點都處在最底層的二叉樹。

這兩種定義是等價的。

 

性質

1)        如果一顆樹深度爲h,最大層數爲k,且深度與最大層數相同,即k=h;

2)        它的葉子數是: 2^(h-1)

3)        第k層的結點數是: 2^(k-1)

4)        總結點數是: 2^k-1 (2的k次方減一)

5)        總節點數一定是奇數。

6)        樹高:h=log2(n+1)。

完全二叉樹

完全二叉樹是由滿二叉樹而引出來的。對於深度爲K的,有n個結點的二叉樹,當且僅當其每一個結點都與深度爲K的滿二叉樹中編號從1至n的結點一一對應時稱之爲完全二叉樹。

若設二叉樹的深度爲h,除第 h 層外,其它各層 (1~h-1) 的結點數都達到最大個數,第h 層所有的結點都連續集中在最左邊,這就是完全二叉樹。

(大家好好理解一下上面兩個定義,是等價的~~)

滿二叉樹一定是完全二叉樹,完全二叉樹不一定是滿二叉樹。

 

完全二叉樹的性質:

1)        深度爲k的完全二叉樹,至少有2^(k-1)個節點,至多有2^k-1個節點。

2)        樹高h=log2n + 1

線索二叉樹

對於n個結點的二叉樹,在二叉鏈存儲結構中有n+1個空鏈域,利用這些空鏈域存放在某種遍歷次序下該結點的前驅結點和後繼結點的指針,這些指針稱爲線索,加上線索的二叉樹稱爲線索二叉樹。

根據線索性質的不同,線索二叉樹可分爲前序線索二叉樹、中序線索二叉樹後序線索二叉樹三種。

平衡二叉樹

(Balanced Binary Tree)具有以下性質:它是一棵空樹或它的左右兩個子樹的高度差的絕對值不超過1,並且左右兩個子樹都是一棵平衡二叉樹。常用算法有紅黑樹、AVL、Treap、伸展樹等。在平衡二叉搜索樹中,我們可以看到,其高度一般都良好地維持在O(log(n)),大大降低了操作的時間複雜度。

紅黑樹

紅黑樹是一種自平衡二叉查找樹,是在計算機科學中用到的一種數據結構,典型的用途是實現關聯數組。它是在1972年由Rudolf Bayer發明的,他稱之爲"對稱二叉B樹",它現代的名字是在 Leo J. Guibas 和 Robert Sedgewick 於1978年寫的一篇論文中獲得的。它是複雜的,但它的操作有着良好的最壞情況運行時間,並且在實踐中是高效的: 它可以在O(log n)時間內做查找,插入和刪除,這裏的n是樹中元素的數目。

 

AVL

AVL是最先發明的自平衡二叉查找樹算法。在AVL中任何節點的兩個兒子子樹的高度最大差別爲一,所以它也被稱爲高度平衡樹,n個結點的AVL樹最大深度約1.44log2n。查找、插入和刪除在平均和最壞情況下都是O(log n)。增加和刪除可能需要通過一次或多次樹旋轉來重新平衡這個樹。

 

Treap

Treap是一棵二叉排序樹,它的左子樹和右子樹分別是一個Treap,和一般的二叉排序樹不同的是,Treap紀錄一個額外的數據,就是優先級。Treap在以關鍵碼構成二叉排序樹的同時,還滿足的性質(在這裏我們假設節點的優先級大於該節點的孩子的優先級)。但是這裏要注意的是Treap二叉堆有一點不同,就是二叉堆必須是完全二叉樹,而Treap並不一定是。

 

伸展樹

伸展樹(Splay Tree)是一種二叉排序樹,它能在O(log n)內完成插入、查找和刪除操作。它由Daniel Sleator和Robert Tarjan創造。它的優勢在於不需要記錄用於平衡樹的冗餘信息。在伸展樹上的一般操作都基於伸展操作。

 

SBT

Size Balanced Tree(簡稱SBT)是一自平衡二叉查找樹,是在計算機科學中用到的一種數據結構。它是由中國廣東中山紀念中學的陳啓峯發明的。陳啓峯於2006年底完成論文《Size Balanced Tree》,並在2007年的全國青少年信息學奧林匹克競賽冬令營中發表。由於SBT的拼寫很容易找到中文諧音,它常被中國的信息學競賽選手和ACM/ICPC選手們戲稱爲“傻B樹”、“Super BT”等。相比紅黑樹、AVL樹等自平衡二叉查找樹,SBT更易於實現。據陳啓峯在論文中稱,SBT是“目前爲止速度最快的高級二叉搜索樹”。SBT能在O(log n)的時間內完成所有二叉搜索樹(BST)的相關操作,而與普通二叉搜索樹相比,SBT僅僅加入了簡潔的核心操作Maintain。由於SBT賴以保持平衡的是size域而不是其他“無用”的域,它可以很方便地實現動態順序統計中的selectrank操作。

二叉搜索/查找/排序樹

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

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章