二叉樹重構

已知前序中序求后序

//Tree Recovery
#include <iostream>
#include <string>
using namespace std;



void PostOrder(int pre[], int in[], int post[], int left, int right, int&pos, int&index);//構建后序遍歷序列
void input(int a[], const int n, string s);//輸入
void output(int a[], const int n);//輸出
int find(int a[], int left, int right, const int e);//在中序序列中找與先序序列對應的元素的位置

int main()
{
    int length;//序列長度
    int pos = 0;//序列查找的位置
    int index = 0;//構建后序序列的下標
    cout << "length:";
    cin >> length;

    int* in = new int[length];
    int*pre = new int[length];
    int*post = new int[length];

    input(pre, length, "PreOrder:");
    input(in, length, "InOrder:");

    PostOrder(pre, in, post, 0, length - 1, pos, index);
    output(post, length);

    return 0;
}

//~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
void PostOrder(int pre[], int in[], int post[], int left, int right, int&pos, int&index)
{
    if (left > right)//節點不存在
    {
        return;
    }
    int i = find(in, left, right, pre[pos++]);//查找
    if (i == right && right == left)//葉子結點
    {
        post[index++] = in[i];//加入后續遍歷序列中
        return;
    }
    PostOrder(pre, in, post, left, i - 1, pos, index);//遞歸左子樹
    PostOrder(pre, in, post, i + 1, right, pos, index);//遞歸右子樹
    post[index++] = in[i];//插入根節點
}
//~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~

void input(int a[], const int n, string s)
{
    cout << s;
    for (int i = 0; i < n; i++) {
        cin >> a[i];
    }
}
void output(int a[], const int n)
{
    cout << "PostOrder:";
    for (int i = 0; i < n; i++) {
        cout << a[i] << " ";
    }
    cout << endl;
}
int find(int a[], int left, int right, const int e)
{
    for (int i = left; i <= right; i++) {
        if (e == a[i])
            return i;
    }
    return 0;
}
最后編輯于
?著作權歸作者所有,轉載或內容合作請聯系作者
平臺聲明:文章內容(如有圖片或視頻亦包括在內)由作者上傳并發布,文章內容僅代表作者本人觀點,簡書系信息發布平臺,僅提供信息存儲服務。

推薦閱讀更多精彩內容

  • 之前的文章中關于二叉樹的先序遍歷,中序遍歷,后序遍歷,層次遍歷,當然我們可以根據二叉樹的先序和中序, 重構二叉樹,...
    FlyElephant閱讀 306評論 0 1
  • 數據結構和算法--二叉樹的實現 幾種二叉樹 1、二叉樹 和普通的樹相比,二叉樹有如下特點: 每個結點最多只有兩棵子...
    sunhaiyu閱讀 6,529評論 0 14
  • 給定一個前序和中序變量的結果,寫一個算法重建這棵樹:前序: a b d c e f中序: d b a e c f...
    HangChen閱讀 547評論 0 3
  • 記我的老師林少杰 時間在流逝,透窗的光線默默無聲一格一格掃過畫案上斑斑點點的羊毛氈,墨香氤氳又夾雜著淡淡的煙草氣味...
    半山桃源閱讀 878評論 2 3
  • 《男人夢》目錄 “覺察到人的無趣?”我打斷他即將說下去的話,問道。 他神情一凝,用復雜的神情看著我,慢慢點下了頭。...
    紙才閱讀 234評論 0 0