公衆號:人魔七七git
Github:github.com/renmoqiqi/1…github
二叉樹的節點最大分支度是2,也說明每一個節點最多擁有2個子節點,範圍是[0-2]。數組
下面咱們推導下Max Nodes。上圖第三種狀況h = 3,Max Nodes = 1 +2 + 22+ 23 = 15,也就是Max Nodes = 1 +2 + 22+ 23 + ....+ 2h= ,也就是等比數列求和,以下圖:bash
代入求和 Max Nodes = 1 +2 + 2 2+ 2 3 + ....+ 2 h=2 h+1-1等比數列求和能夠參考以下連接: zh.wikipedia.org/wiki/等比數列數據結構
反過來能夠很容易推導出Min Height (h = Log2(n+1)-1),Max Height(h = n-1)。性能
若是是full binary tree那麼節點數和樹Height的關係又是什麼呢? 推導過程能夠參考上面的步驟,Min Nodes(n = 2h+1),Max Nodes(2h+1-1),反過來能夠很容易推導出Min Height (h = Log2(n+1)-1),Max Height(h = )。ui
第i層至多擁有2i-1個節點,最少有1個節點。從下圖能夠很容易看出來, atom
度爲0的節點數n1和度爲2節點數n2的關係。n1 = n2 + 1。看下圖 spa
二叉樹能夠被以廣度優先的順序做爲隱式數據結構存儲在數組中。注意的是若是這個二叉樹是complete binary tree,這些不會浪費空間,可是若是對於A degenerate (or pathological) tree這種高度很大的樹就很浪費空間,能夠參考後面根據這個存儲方式判斷這個樹是否是complete binary tree的介紹。這種存儲方法一般也用在binary heaps。.net
舉例:找E的父節點,E的索引是5,那麼Parent = i/2 = 5/2 = 2.5,向下取整就是2,對應的就是B。反之假如找A的左右孩子,A的索引是1,那麼左孩子索引就是2對應B,右孩子索引就是3對應C。
注意:Parent的索引若是有存在小數狀況是向下取整。
下面咱們看怎麼根據這個表示方法判斷是否是complete binary tree。
上三個圖中1,2元素之間沒有空白的空間是complete binary tree,圖3元素之間有空白的空間說明不是complete binary tree。@interface DSTreeNode : NSObject
@property (nonatomic, strong) NSObject *object;
@property (nonatomic, strong) DSTreeNode *leftChild;
@property (nonatomic, strong) DSTreeNode *rightChild;
@property (nonatomic, strong) DSTreeNode *parent;
@property (nonatomic, assign) SEL compareSelector;
- (void)printDescription;
//是不是左仍是結點
- (BOOL)isLeftChildOfParent;
@end
複製代碼
這種存儲二叉樹方法浪費了很多內存,因爲那些節點的左右指針(爲null或者指向某些節點)。