2021年2月3日
终于到了总结时间了
现在算是入门树了
虽然道路很坎坷 但是还是坚持把他搞完了
这里我题解一个题来加强印象吧
问题 B: 二叉树,知中序后序,求先序(递归)
描述
已知二叉树的中序、后序,建树求先序。
格式
输入格式
中序序列
后序序列
输出格式
先序序列
样例
样例输入 Copy
d g b a e c f
g d b e f c a
样例输出 Copy
a b d g c e f
知道后序和中序求前序
就整个后序而言 最后一个一定是根节点
那么就就是前序的第一个输出
那晓得了根节点
在中序当中就可以分清了 左子树和又子树
那么也就可以晓得了 左子树几点树 和又子树节点数了
那么后序的左右子树也就可以分清楚了
#include<bits/stdc++.h>
using namespace std;
char a[1000005];//中序
char b[1000005];//后序
int stop=0;
int put(char *a)
{
gets(a);
int n=strlen(a);
int j=0;
for(int i=0;i<n;i++)
{
if(a[i]!=' ')a[j++]=a[i];
}
a[j]=0;
return 1;
}
int fun(int a)
{
if(a>=0&&a<stop)return 1;
return 0;
}
int dfs(int start1,int end1,int start2,int end2)
{
if(end1-start1<0)return 1;
if(!(fun(start1)&&fun(end1)&&fun(start2)&&fun(end2)))return 0;
//if(start2==end2)return 1;
//if(end2-start2==2)
//{
// cout<<b[end2]<<" "<<b[start2+1]<<" "<<b[start2]<<" ";
// return 1;
//}
cout<<b[end2]<<" ";
// if(start1==end1)return 1;
int i=start1;
while(a[i]!=b[end2])i++;
dfs(start1,i-1,start2,start2+(i-1-start1));//找左子树的根
dfs(i+1,end1,end2-1-(end1-i-1),end2-1);//找右子树的右子树
}
int main()
{
int n;
put(a);
put(b);
n=strlen(a);
stop=n;
//puts(a);
//puts(b) ;
dfs(0,n-1,0,n-1);
}
看得出来经历了很多调试
我也来一句名言吧 芜湖:男人至死是少年!!(似乎有点不搭边啊)