#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
求解,函数里哪里错了。
你这是模仿刘汝佳那本《算法入门经典》写的吧,其实这题可以先把二叉树构造出来,然后先序遍历二叉树即可。(虽然走了弯路)
是的,这个我不知道怎么去构造,求解。
@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; }
@我非英雄:
我有两点不明白,求解释。
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. 这点有点不明白。
@fengyu123: i-low2表示每次划分之后,左子树的序列长度
@我非英雄:
非常感谢,我明白了。