知先序和中序求后序
7-42 重构二叉树 (25 分)
给出两个字符串,分别表示二叉树的先序遍历(根、左子树、右子树)和中序遍历(左子树、根、右子树)的结果。
例如,对于下面的二叉树,先序遍历结果是DBACEGF,中序遍历结果是ABCDEFG。
假定二叉树的每个节点都用大写的字母标识,且对于同一棵二叉树,同一个字母不会用两次。现在请你根据给出的先序遍历和中序遍历,重构这棵二叉树。
输入格式:
输入包含一个或多个测试用例。每个测试用例一行,给出两个字符串,表示对二叉树进行先序遍历和中序遍历的结果。这两个字符串都是由大写字母组成(因此它们的长度不超过26)。
输出格式:
将每个测试用例转化为一棵二叉树,并在一行中输出树的后序遍历(左子树、右子树、根)的结果。
输入样例:
DBACEGF ABCDEFG
BCAD CBAD
输出样例:
ACBFGED
CDAB
AC代码:
#include<iostream>
#include<cstring>
using namespace std;
string s1,s2;
void tree(int r1,int l1,int r2,int l2)
{
if(r1>l1)
return;
int root=s2.find(s1[r1]);
tree(r1+1,r1+root-r2,r2,root-1);
tree(r1+root-r2+1,l1,root+1,l2);
cout<<s1[r1];
}
int main()
{
while(cin>>s1>>s2){
tree(0,s1.length()-1,0,s2.length()-1);
cout<<endl;
}
}
知后序和中序求先序
7-13 根据后序和中序遍历输出先序遍历 (25 分)
本题要求根据给定的一棵二叉树的后序遍历和中序遍历结果,输出该树的先序遍历结果。
输入格式:
第一行给出正整数N(≤30),是树中结点的个数。随后两行,每行给出N个整数,分别对应后序遍历和中序遍历结果,数字间以空格分隔。题目保证输入正确对应一棵二叉树。
输出格式:
在一行中输出Preorder: 以及该树的先序遍历结果。数字间有1个空格,行末不得有多余空格。
输入样例:
7
2 3 1 5 7 6 4
1 2 3 4 5 6 7
输出样例:
Preorder: 4 1 3 2 6 5 7
AC代码:
#include<stdio.h>
int a[100000],b[10000],n;
void fun(int r1,int l1,int r2,int l2)
{
int i,sum=0;
if(r1>l1)
return ;
for(i=0;b[i]!=a[l1];i++);
printf(" %d",a[l1]);
fun(r1,l1-l2+i-1,r2,i-1);
fun(l1-l2+i,l1-1,i+1,l2);
}
int main()
{
scanf("%d",&n);
for(int i=0;i<n;i++)
{
scanf("%d",&a[i]);
}for(int i=0;i<n;i++)
{
scanf("%d",&b[i]);
}
printf("Preorder:");
fun(0,n-1,0,n-1);
}