博客园 首页 私信博主 显示目录 隐藏目录 管理 动画

先序中序求后序(静态写法)

先序中序求后序

题目描述

给出一棵二叉树的先序和中序遍历,让我们求出这棵二叉树的后序遍历

思路

我们用题目给出的的这棵二叉树的先序和中序遍历,首先确定这整棵树的形状,然后遍历这棵树最后给出这棵树的后序遍历。

在这棵树中我们采用静态写法(不用指针)这对不喜欢用指针的我来说简直是一个福利,首先我们构建一个结构体,来存储当前节点的名称,以及它的左儿子和右儿子,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;
}
posted @ 2020-06-17 11:30  5656566  阅读(188)  评论(0)    收藏  举报