已知一棵二叉树的前序和中序遍历的结果,还原这棵二叉树并输出其后序遍历的结果
前序遍历的递归定义: ‘根节点’+‘左子树的前序遍历’+‘右子树的前序遍历’
中序遍历的递归定义: ‘左子树的中序遍历’+‘根节点’+‘右子树的中序遍历’
后序遍历的递归定义: ‘左子树的后序遍历’+‘右子树的后序遍历’+‘根节点’
定义post_order(str1, str2)为一棵前序遍历的结果为str1,中序遍历的结果为str2的二叉树的后序遍历的结果
由str1我们可以得到根节点(str1[0])。于是,我们可以得到str1l, str2l, str1r, str2r。
post_order(str1, str2)=post_order(str1l, str2l)+post_order(str1r, str2r)+root
继续递归下去,我们就把这课树拆开了
然后再拼成我们想要的模样(后序遍历)
前序遍历的递归定义: ‘根节点’+‘左子树的前序遍历’+‘右子树的前序遍历’
中序遍历的递归定义: ‘左子树的中序遍历’+‘根节点’+‘右子树的中序遍历’
后序遍历的递归定义: ‘左子树的后序遍历’+‘右子树的后序遍历’+‘根节点’
定义post_order(str1, str2)为一棵前序遍历的结果为str1,中序遍历的结果为str2的二叉树的后序遍历的结果
由str1我们可以得到根节点(str1[0])。于是,我们可以得到str1l, str2l, str1r, str2r。
post_order(str1, str2)=post_order(str1l, str2l)+post_order(str1r, str2r)+root
继续递归下去,我们就把这课树拆开了
然后再拼成我们想要的模样(后序遍历)
#include<iostream>
#include<stdio.h>
#include<vector>
#include<string>
using namespace std;
#define LarN 1000
void printTree(const char *pre,const char *in,int length)
{
if(length<1)return;
int idx=0;
while(in[idx]!=pre[0])idx++;
printTree(pre+1,in,idx); //post_order(str1l, str2l)
printTree(pre+idx+1,in+idx+1,length-idx-1); //post_order(str1r, str2r)
printf("%c",pre[0]); //root
}
int main()
{
string Pre,In;
cin>>Pre;
cin>>In;
printTree(Pre.c_str(),In.c_str(),Pre.length());
return 0;
}