通过先序中序求出后序遍历

2021-11-25 22:55:38

 

因为从先序遍历的第一个是根节点,然后把中序遍历得到的数组分成了两部分,左边的左子树的所有节点,右边是右子树的所有节点。然后在根据先序遍历,因为是 根节点->左子树->右子树 第二个节点(如果中序的左边还有值)一定是左子树的节点。用它当做根节点依次重复就好了。依次重复就好了,需要注意区间的选择

 

 

#include<bits/stdc++.h>
using namespace std;
typedef struct NNN {
    int data;
    NNN* lnext = nullptr;
    NNN* rnext = nullptr;
}trees;
int a[10] = { 1,2,3,4,7,8,9,11,13,15 };//这个是中序遍历得到的数组
int b[10] = { 7,3,1,2,4,9,8,13,11,15 };//这个是先序遍历得到的数组
int cno = 0;

void after(trees* p) {
    if (p->lnext != nullptr && p->rnext != nullptr) {
        after(p->lnext);
        after(p->rnext);
        cout << p->data << " ";
    }
}
void rebuild(trees* p, int left, int right) {//确定一个区间然后取出根节点分成两部分来处理,有点像快速排序那样
    for (int i = left; i < right; i++) {
        if (a[i] == b[cno])
        {
            p->data = a[i];
            p->lnext = new trees;
            p->rnext = new trees;//这里写得不好,但是凑合一下吧懒得改了
            cno++;//
            rebuild(p->lnext, left, i);
            rebuild(p->rnext, i + 1, right);
            break;
        }
    }
}
int main() {
    trees* Tree = new trees;
    trees* head = Tree;
    rebuild(Tree, 0, 10);
    after(head);
}

 

//不知道以后会不会想到更好的办法,第一次写博客,不会画那个图...

 

posted @ 2021-11-25 23:17  -或·彧-  阅读(101)  评论(0编辑  收藏  举报