二叉樹(binary tree)

來源:互聯網
上載者:User
二叉樹的定義

  二叉樹的定義:樹的度為2的樹。

  二叉樹的遞迴定義:二叉樹或者是一棵空樹,或者是一棵由一個根結點和兩棵互不相交的左子樹和右子樹所組成的非空樹,而左右子樹又都是一棵二叉樹。

二叉樹的性質

  1.第i層上至多有2的i-1次方個結點。

  2.深度為h的二叉樹至多有2的h次方減1個結點。

  3.每一層都滿的二叉樹稱為滿二叉樹,只在最後一層右邊缺若干個結點的樹稱為完全二叉樹

  (對結點的編號通常都是從滿二叉樹的樹根開始,從上到下從左至右編號)。

  完全二叉樹的重要性質:

  1.編號為i的結點,左孩子編號為2i,右孩子編號為2i+1.

  2.除根結點外,編號為i的結點,其父結點的標號為i/2向下取整。

二叉樹的儲存結構

  同線性表一樣,二叉樹有順序和連結兩種儲存結構。

1.順序儲存結構

  順序儲存一棵二叉樹,首先對該樹中每個結點進行編號,然後以各個結點的編號為下標,把各結點的值對應儲存到一個一維數組中。

  每個結點的編號與等深度的滿二叉樹中對應的結點編號相同,即樹根編號為1,然後從上到下從左至右編號,i結點的左右孩子為2i和2i+1.

  缺點:對於單支結點較多的二叉樹來說很多儲存位置空閑。

2.連結儲存結構

  連結儲存中通常採用的方法是,在每個結點中設定三個域:範圍(用來儲存對應的資料元素),左指標域和右指標域。

  另一種方法是,在如上的結構中再增加一個parent指標域(便於尋找父結點)。

  不帶雙親指標的連結儲存結構稱作二叉鏈表,既可以由獨立分配的結點連結而成,也可以由數組中的元素結點連結而成。

  獨立結點的類型可以這樣定義:

struct BTreeNode{    ElemType data;    BTreeNode* left;    BTreeNode* right;};

       數組元素結點可以定義為

struct ABTreeNode{    ElemType data;    int left,right;};

  第二種形式中left和right域分別儲存左右孩子結點所在單元的下標,所以被定義為整型。

  在數組中建立二叉樹的好處是,建立好後可以把整個數組寫入到檔案中儲存起來,需要時再從檔案中讀入到數組中。

二叉樹遍曆

  設二叉樹由BTreeNode類型的、通過動態分配產生的獨立結點連結而成,並設BT為指向根結點的指標。

  前序走訪
void PreOrder(BTreeNode* BT){    if(BT != NULL)    {        cout<<BT->data<<' ';  //訪問根結點,操作視應用而定          PreOrder(BT->left);        PreOrder(BT->right);    }}
 中序遍曆
void InOrder(BTreeNode* BT){    if(BT != NULL)    {        InOrder (BT->left);        cout<<BT->data<<' ';        InOrder (BT->right);    }

後序遍曆

void PostOrder(BTreeNode* BT){    if(BT != NULL)    {        PostOrder (BT->left);        PostOrder (BT->right);        cout<<BT->data<<' ';    }}

 按層遍曆

可以按照二叉樹的階層進行遍曆,即按照從上到下從左至右的次序訪問各個結點。

  按層遍曆演算法需要使用一個隊列,開始時把整個樹的根結點入隊,然後每從隊列中刪除一個結點並輸出該結點的值時,都把它的非空的左右孩子結點入隊,這樣當隊列空時演算法結束。

//按層遍曆void LevelOrder(BTreeNode* BT){    const int MaxSize = 30; //定義用於儲存隊列的數組長度    //在這個演算法中,隊列的最大長度不會超過二叉樹中一層上的最大結點數    BTreeNode* q[MaxSize];  //定義隊列所使用的數組空間    int front=0, rear=0;    //定義隊首指標和隊尾指標,初始為空白隊    BTreeNode* p;    if(BT != NULL) //將樹根指標進隊    {        rear = (rear +1) % MaxSize;        q[rear] = BT;    }    while(front!=rear)  //當隊列非空時執行迴圈    {        front=(front + 1) % MaxSize;  //使隊首指標指向隊首元素        p = q[front];                  //操作並刪除隊首元素        cout<<p->data<<' ';        if(p->left !=NULL)        //若存在左孩子,則該結點指標進隊        {            rear = (rear +1) % MaxSize;            q[rear] = p->left;                }        if(p->right !=NULL)        //若存在右孩子,則該結點指標進隊        {            rear = (rear +1) % MaxSize;            q[rear] = p->right;                }    }//while end}

轉載自:

http://www.cnblogs.com/mengdd/archive/2012/10/31/2748760.html

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.