iOS數據結構與算法實戰 Binary Trees 上

來源

公衆號:人魔七七git

Github:github.com/renmoqiqi/1…github

一張圖來描述Binary Tree

tree Des

二叉樹的節點最大分支度是2,也說明每一個節點最多擁有2個子節點,範圍是[0-2]。數組

Binary Tree的幾個常見類型

  • A degenerate (or pathological) tree。(樹的每一個節點只有一個子節點或者是右孩子或者是左孩子,這時候這個樹就和鏈表性能差很少了。)

BSType1

  • Full Binary Tree (樹的任何一個節點都有0或者2個孩子節點。或者這樣定義樹的任何一個非葉子節點都有兩個孩子節點)

fullTreeType1

fullTreeType2

fullTreeType3

  • Complete Binary Tree(可能除了樹的最後一層其它層級的每一個節點都有左右孩子節點,最後一層要麼是滿的要麼節點都靠左邊)
    fullTreeType1
    competitionType
  • Perfect Binary Tree (它是一個這樣的二叉樹,他全部的非葉子節點都有左右子節點,而且全部的葉子節點都在同一層級)

fullTreeType1
Perfect Binary Tree1

和Binary Tree有關的一些公式

  • 節點數和二叉樹樹Height的關係,假如h是樹的Height,n是樹節點個數。那麼Min Nodes(n = h+1),Max Nodes(2h+1-1)。看下圖例子,很容易推導出Min Nodes(n = h+1)。
    H NumbersN 1
    H NumbersN 2

下面咱們推導下Max Nodes。上圖第三種狀況h = 3,Max Nodes = 1 +2 + 22+ 23 = 15,也就是Max Nodes = 1 +2 + 22+ 23 + ....+ 2h= ,也就是等比數列求和,以下圖:bash

等比數列
等比數列1
代入求和 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 = {n-1}\over{2})。ui

  • 第i層至多擁有2i-1個節點,最少有1個節點。從下圖能夠很容易看出來, atom

    第I層個數

  • 度爲0的節點數n1和度爲2節點數n2的關係。n1 = n2 + 1。看下圖 spa

    deg(n)關係

二叉樹的存儲方式

  • Array Representation
  • Linked Representation

Array Representation

二叉樹能夠被以廣度優先的順序做爲隱式數據結構存儲在數組中。注意的是若是這個二叉樹是complete binary tree,這些不會浪費空間,可是若是對於A degenerate (or pathological) tree這種高度很大的樹就很浪費空間,能夠參考後面根據這個存儲方式判斷這個樹是否是complete binary tree的介紹。這種存儲方法一般也用在binary heaps。.net

Array表示法

舉例:找E的父節點,E的索引是5,那麼Parent = i/2 = 5/2 = 2.5,向下取整就是2,對應的就是B。反之假如找A的左右孩子,A的索引是1,那麼左孩子索引就是2對應B,右孩子索引就是3對應C。

注意:Parent的索引若是有存在小數狀況是向下取整。

下面咱們看怎麼根據這個表示方法判斷是否是complete binary tree。

Array判斷是否是徹底二叉樹1
Array判斷是否是徹底二叉樹2
Array判斷是否是徹底二叉樹3
上三個圖中1,2元素之間沒有空白的空間是complete binary tree,圖3元素之間有空白的空間說明不是complete binary tree。

Linked Representation

Linked表示法

@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或者指向某些節點)。

相關文章
相關標籤/搜索