前序:ABDGCEFH
中序:DGBAECHF
想要求后序就要把树重建出来,我们理一下思路。
1.由前序遍历的性质可以知道A必然是树的根节点
2.中序遍历中A之前的就肯定是A的左子树,A后面的就是A的右子树。
好的,我们现在可以把中序分一下,变成:DGB | A | ECHF
同样左子树和右子树在前序上也是连续的,所以我们可以分成 A | BDG | CEFH
你一定已经想到递归了,对,如果只看左子树的话又当成一个新的树,题目变成已知前序为:BDG,中序为:DGB,求原来的树。右子树同理。
#include <iostream>
#include <string>
using namespace std;
struct Node{
char val;
Node *rc, *lc;
} ;
Node* rebuild(string pre,string mid)
{
int i, len;
Node *head = new Node();
head->val = pre[0];
len = mid.length();
for(i = 0; i < len; i++){
if(pre[0] == mid[i]){
if(i != 0){
head->lc = rebuild(pre.substr(1,i),mid.substr(0,i));//左子树
}else{
head->lc = NULL;
}
if(i != len-1){
head->rc = rebuild(pre.substr(i+1,len-1-i),mid.substr(i+1,len-1-i));//右子树
}else{
head->rc = NULL;
}
}
}
return head;
}
void after(Node *head)
{
if(head==NULL){
return;
}else{
if(head->lc != NULL)
after(head->lc);
if(head->rc != NULL)
after(head->rc);
cout << head->val;
}
}
int main()
{
string pre, mid;
Node *head = NULL;
while(cin >> pre >> mid) {
Node * head;
head = rebuild(pre,mid);
after(head);
}
return 0;
}
注意substr这个函数的参数的意思是substr(start,length),递归左子树的时候,左子树子串前序和中序的length等于i,并不是到i那个位置结束。
转载:https://www.cnblogs.com/maskmtj/p/4793247.html
本文介绍如何根据给定的前序和中序遍历序列重建二叉树,并求得后序遍历序列。通过递归算法实现,首先确定根节点,然后划分左右子树,递归调用重建子树。

1324

被折叠的 条评论
为什么被折叠?



