數據結構-二叉樹

一、二叉樹的定義

    通用樹結構是採用雙親孩子表示法模型建立的,每個結點都有一個指向其雙親的指針;每個結點

都有若干個指向其孩子的指針。但是我們還有另一種樹的模型,那就是孩子兄弟表示法模型,每個結

點都有一個指向其第一個孩子的指針,每個結點都有一個指向其第一個右兄弟的指針;每個結點包含

一個數據指針和兩個結點指針:

    數據指針:指向保存於樹中的數據;
    
    孩子結點指針:指向第一個孩子;  

    兄弟結點指針:指向第一個右兄弟。

這種模型表示法的特點是能夠表示任意的樹型結構,每個結點中有且僅有三個指針域(數據指針、孩

子結點指針、兄弟結點指針),每個結點的結構簡單,只有孩子結點和兄弟結點指針構成了“樹

杈”。 

1>定義:二叉樹是由n(n>=0)個結點組成的有限集合,該集合或者爲空,或者是由一個根結點加上

分別稱爲左子樹右子樹的、互不相交的二叉樹組成。

    滿二叉樹(Full Binary Tree):如果二叉樹中所有的分支結點的度數都爲2,且葉子結點都在同

一層次上,則稱這類二叉樹爲滿二叉樹。

    完全二叉樹(Complete Binary Tree):如果一棵具有n個結點的高度爲k的二叉樹,它的每一個結

點都與高度爲k的滿二叉樹中編號爲1--n的結點一一對應,則稱這棵二叉樹爲完全二叉樹。(從上到

下,從左到右編號)。

完全二叉樹的葉結點出現在最下面兩層,最下層的葉節點一定出現在左邊,倒數第二層的葉結點一定

出現在右邊;完全二叉樹中度爲1的結點只有左孩子;同樣結點數的二叉樹,完全二叉樹的高度最

小。

二、二叉樹的深層性質

1>性質1:在二叉樹的第i層最多有2的i-1次方冪個結點。(i > 1).

2>性質2:深度爲k的二叉樹最多有2的k次方冪-1個結點。(k>0);

3>性質3:對任何一棵二叉樹,如果其葉結點有n0個,度爲2的非葉結點有n2個,則有n0=n2+1.

4>性質4:具有n個結點的完全二叉樹的高度爲[log2n]+1.

5>性質5:一棵具有n個結點的二叉樹(高度爲[log2n]+1),按層次對結點進行編號,對任意的結點i有:

如果i=1,則結點i是二叉樹的根;

如果i>1,則其雙親結點爲[i/2];

如果2i<=n,則結點i的左子樹爲2i;

如果2i>n,則結點i無左子樹;

如果2i+1<=n,則結點i的右孩子爲2i+1;

如果2i+1>n,則結點i無右孩子

三、創建二叉樹

1>指路法定位結點:指路法通過結點與目標結點的相對位置進行定位,可以避開二叉樹遞歸的性質“線性”定位。思想:在c語言中可以利用bit位進行指路

    #define BT_LEFT 0
    #define BT_RIGHT 1
    
    typedef unsigned long long BTPos;

2>二叉樹存儲結構

    用結構體來定義二叉樹中的指針域,二叉樹的頭結點也可以用結構體實現;

結點指針域定義:

typedef struct _tag_BTreeNode BTreeNode;
struct _tag_BTreeNode
{
    BTreeNode* left;
    BTreeNode* right;
};

頭結點定義:

typedef struct _tag_BTree TBTree;
struct _tag_BTree
{
    int count;
    BTreeNode* root;
};

數據元素定義示例:
struct Node
{
    BTreeNode header;
    char v;
};
 

3>二叉樹的操作

關鍵技巧:利用二進制的0和1分別表示left和right,位元算是實現指路法的基礎。

while( (count > 0 ) && (current != NULL ) )
{
    bit = pos & 1;
    pos = pos >> 1;

    count--;
    
    parent = current;

    if( bit == BT_LEFT)
        current = current->left;
    
    else if( bit == BT_RIGHT )
        current = current->right;
}
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章