首页 新闻 会员 周边 捐助

求解:二叉树:重建二叉树 ,已知中序和后序, 求先序(用数组做的)

0
悬赏园豆:20 [已解决问题] 解决于 2013-12-05 22:37
#include <iostream>
#include <string.h> 
#include <cstring> 
using namespace std;
//========函数中间有错误======
void xian(int n,char *s1,char *s2,char *res) { if(n<=0)return; int p=strchr(s2,s1[n-1])-s2; //由s1[n-1]中知道树的根节点,求出该根节点在s2中的位置,减去s2的值得到左子树的长度 res[n-1]=s2[p]; // 这里有疑问 xian(p,s1,s2,res); // 左子树递归 xian(n-p-1,s1+p+1,s2+p+1,res+p); //右子树递归 } int main() { char s1[1000]={0}; char s2[1000]={0}; char res[1000]={0}; // 用数组保存 int time; cin>>time; while(time--) { cin>>s1>>s2;//s1为后序,s2为中序 int len=strlen(s1); xian(len,s1,s2,res); cout<<res<<endl; } return 0; }

样例:

输入:

1
ACBFGED
ABCDEFG

输出:

DBACEGF

求解,函数里哪里错了。

lzyer的主页 lzyer | 初学一级 | 园豆:130
提问于:2013-12-01 13:16
< >
分享
最佳答案
1

你这是模仿刘汝佳那本《算法入门经典》写的吧,其实这题可以先把二叉树构造出来,然后先序遍历二叉树即可。(虽然走了弯路)

收获园豆:20
我非英雄 | 菜鸟二级 |园豆:250 | 2013-12-05 09:22

是的,这个我不知道怎么去构造,求解。

lzyer | 园豆:130 (初学一级) | 2013-12-05 20:35

@fengyu123:其实,在画图构建二叉树就已经差不多指导思路了,每次遍历后序序列的最后一个结点,查看它在中序序列中的位置,因为后序中最后一个结点就是根结点,对应到中序序列中,就将中序序列划分成了左右子树两个序列。下面贴下代码,应该能看得懂。

BiTree BuildTrees(BiTree &T,char post[],char in[],int low1,int high1,int low2,int high2)
{
    int i;
    if(low1<=high1)
    {
        T=(BiNode*)malloc(sizeof(BiNode));
        T->data=post[high1];
        T->lchild=T->rchild=NULL;
        i=low2;
        while(in[i]!=post[high1])
            i++;
        BuildTrees(T->rchild,post,in,low1+i-low2,high1-1,i+1,high2);
        BuildTrees(T->lchild,post,in,low1,low1+i-low2-1,low2,i-1);
    }
    return T;
}

 

我非英雄 | 园豆:250 (菜鸟二级) | 2013-12-05 21:33

@我非英雄: 

我有两点不明白,求解释。

BuildTrees(T->rchild,post,in,low1+i-low2,high1-1,i+1,high2);中的  low1+i-low2,怎么不是low1+i;

BuildTrees(T->lchild,post,in,low1,low1+i-low2-1,low2,i-1);中的low1+i-low2-1,怎么不是low1+i-1;

为什么都要减去low2. 这点有点不明白。

lzyer | 园豆:130 (初学一级) | 2013-12-05 21:45

@fengyu123: i-low2表示每次划分之后,左子树的序列长度

我非英雄 | 园豆:250 (菜鸟二级) | 2013-12-05 22:08

@我非英雄: 

非常感谢,我明白了。

lzyer | 园豆:130 (初学一级) | 2013-12-05 22:36
清除回答草稿
   您需要登录以后才能回答,未注册用户请先注册