中序后序求先序(静态写法)
中序后序求先序
题目描述
给出一棵二叉树的中序和后序遍历,让我们求出这棵二叉树的先序遍历
思路
我们用题目给出的的这棵二叉树的中序和后序遍历,首先确定这整棵树的形状,然后遍历这棵树最后给出这棵树的先序遍历。
在这棵树中我们采用静态写法(不用指针)这对不喜欢用指针的我来说简直是一个福利,首先我们构建一个结构体,来存储当前节点的名称,以及它的左儿子和右儿子,a数组来储存所有的节点。
后序遍历知道最后的一个点是根节点,所以说我们用build函数用来建一棵二叉树,首先a【根节点】.名称=s2【x2】 (这里的下标不用减一,是因为x2不是等于s2.size(),而是等于s2.size()-1,所以不用减一了) ;用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;
}
中序后序求先序(静态写法)(这个是正确的)
#include<bits/stdc++.h>
using namespace std;
string s1,s2;
struct node{
char ch;
int l;
int r;
}a[10001];
int cnt=0;
int build(int x1,int x2,int y1,int y2){
a[++cnt].ch=s2[y2];
int wz=x1;
while(s1[wz]!=s2[y2])wz++;
int lsize=wz-x1;
int rsize=x2-wz;
int num=cnt;
if(lsize>0)a[num].l=build(x1,wz-1,y1,y1+lsize-1);
else a[num].l=-1;
if(rsize>0)a[num].r=build(wz+1,x2,y2-rsize,y2-1);
else a[num].r=-1;
return num;
}
void print(int now){
if(now==-1){
return;
}
cout<<a[now].ch;
print(a[now].l);
print(a[now].r);
}
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;
}
浙公网安备 33010602011771号