先序中序求后序(静态写法)
先序中序求后序
题目描述
给出一棵二叉树的先序和中序遍历,让我们求出这棵二叉树的后序遍历
思路
我们用题目给出的的这棵二叉树的先序和中序遍历,首先确定这整棵树的形状,然后遍历这棵树最后给出这棵树的后序遍历。
在这棵树中我们采用静态写法(不用指针)这对不喜欢用指针的我来说简直是一个福利,首先我们构建一个结构体,来存储当前节点的名称,以及它的左儿子和右儿子,a数组来储存所有的节点。
先序遍历知道第一个点是根节点,所以说我们用build函数用来建一棵二叉树,首先a【根节点】.名称=s1【x1】;用wz来查找根节点的位置,这样就可以直接确定出该节点的左右子树,这样就可以递归调用了。
print函数用来后序输出 当now==-1时说明此个节点是一个叶节点没有孩子了,就可以return了,这就是我们递归的边界。
后序 | 先序 | 中序 |
---|---|---|
print(a[now].l); | cout<<a[now].ch; | print(a[now].l |
print(a[now].r); | print(a[now].l | cout<<a[now].ch; |
cout<<a[now].ch; | print(a[now].l); | print(a[now].l); |
注意:
这三个语句不能弄反了,要不然就只能先序或中序输出了!!
先序中序求后序(静态写法)
#include<bits/stdc++.h>
using namespace std;
string s1,s2;
struct node{
char ch;
int r;
int l;
}a[10001];
int cnt=0;
int build(int x1,int x2,int y1,int y2){
a[++cnt].ch=s1[x1];
int wz=y1;
while(s2[wz]!=s1[x1])wz++;
int lchild=wz-y1;
int rchild=y2-wz;
int num=cnt;
if(lchild>0)a[num].l=build(x1+1,x1+lchild,y1,wz-1);
else a[num].l=-1;
if(rchild>0)a[num].r=build(x1+lchild+1,x2,wz+1,y2);
else a[num].r=-1;
return num;
}
void print(int now){
if(now==-1){
return;
}
print(a[now].l);
print(a[now].r);
cout<<a[now].ch;
}
int main(){
while(cin>>s1>>s2){
memset(a,0,sizeof(a));
cnt=0;
build(0,s1.size()-1,0,s2.size()-1);
print(1);
cout<<endl;
}
return 0;
}