二叉樹相關算法:重構與層次遍歷

二叉樹的重構——需要至少有中序遍歷序列,以及前序后序任意一個

基本思路:以下以L表示左子樹/左孩子,V表示當前節點,R表示右子樹/右孩子,這里以中序+后序為例

中序遍歷序列順序為LVR,后序遍歷序列順序為LRV,因此可以直接從后序遍歷序列中找出根節點V,即序列中的最后一個元素

然后以V為分界,對中序遍歷序列進行分割——可以很容易地看出,V左側即為左子樹的中序遍歷序列,右側即為右子樹的中序遍歷序列

同樣的長度可以用于分割后序遍歷序列,依次得到左右子樹的兩個序列

接下來對兩個子樹進行遞歸調用即可

演示代碼:

using namespace std;
typedef struct Node {
    Node * lchild;
    Node * rchild;
    int data;
}Node;
int post[31]; //LRV
int in[31]; //LVR
Node *tree;

void buildTree(int p1, int p2, int i1, int i2, Node* &treeNode) {
    if (treeNode==NULL)
    {
        treeNode = new Node();
    }
    if (p1>p2||i1>i2)
    {
        return;
    }
    //cout << “flag”<< endl;
    treeNode->lchild = NULL;
    treeNode->rchild = NULL;
    treeNode->data = post[p2];
    //cout <<post[p2] << endl;
    int count = p1;
    int i;
    for ( i =i1 ; i <=i2; i++, count++)
    {
        if (post[p2] == in[i]) { //V found
            break;
        }
        
    }
    buildTree(p1, count – 1, i1, i – 1, treeNode->lchild);
    buildTree(count, p2 – 1, i + 1, i2, treeNode->rchild);
}//注意邊界值

二叉樹的層次遍歷:

新建一個輔助隊列,將根節點入隊,然后出隊

對根節點進行訪問——同時,如果根節點存在后代的話,按照左右孩子的順序依次入隊

循環進行此操作,直至整個隊列徹底為空再停止

演示代碼:

    queue<Node*>level;
    level.push(tree);
    vector<int>output;
    while (!level.empty())
    {
        if (level.front()->data)
        {
            int number = level.front()->data;
//            cout << number << endl;
            output.push_back(number);
        }

        if (level.front()->lchild!=NULL)
        {
            level.push(level.front()->lchild);
        }
        if (level.front()->rchild!=NULL)
        {
            level.push(level.front()->rchild);
        }
        level.pop();
    }
最后編輯于
?著作權歸作者所有,轉載或內容合作請聯系作者
平臺聲明:文章內容(如有圖片或視頻亦包括在內)由作者上傳并發布,文章內容僅代表作者本人觀點,簡書系信息發布平臺,僅提供信息存儲服務。

推薦閱讀更多精彩內容

  • 樹的概述 樹是一種非常常用的數據結構,樹與前面介紹的線性表,棧,隊列等線性結構不同,樹是一種非線性結構 1.樹的定...
    Jack921閱讀 4,484評論 1 31
  • 1 序 2016年6月25日夜,帝都,天下著大雨,拖著行李箱和同學在校門口照了最后一張合照,搬離寢室打車去了提前租...
    RichardJieChen閱讀 5,152評論 0 12
  • 本文轉自 http://www.cnblogs.com/manji/p/4903990.html二叉樹-****你...
    doublej_yjj閱讀 689評論 0 8
  • 這幾天開學,學校還在上課,最近也是在找工作,很多天都沒有更新文章,現在補一篇二叉樹的文章。 最近校招公司的筆試陸續...
    zero_sr閱讀 3,987評論 0 5
  • 8月匆匆走過,9月10月的考試很快來臨,準備不足,又不想放棄。開始擔憂,進入抱佛角階段,心存一絲僥幸。 ...
    失落真心閱讀 262評論 0 0