先序中序遍历__还原二叉树
4-1-二叉树及其遍历 还原二叉树 (25分)
给定一棵二叉树的先序遍历序列和中序遍历序列,要求计算该二叉树的高度。
输入格式:
输入首先给出正整数N(≤50),为树中结点总数。下面两行先后给出先序和中序遍历序列,均是长度为N的不包含重复英文字母(区别大小写)的字符串。
输出格式:
输出为一个整数,即该二叉树的高度。
输入样例:
9
ABDFGHIEC
FDHGIBEAC
输出样例:
5
解题思路
1.树是递归定义的,一定要记住这句话
所以一个树的先序遍历,他的根的左右儿子也是先序遍历
中序遍历同理
我们拿样例来模拟
然后再把左子树的两种序列进行处理
稍加计算出起始位置就行了
然后递归处理就可以,剩下的就不模拟了
中序遍历同理
2.先序遍历的第一个节点就是根节点
3.找到先序的根节点之后,在中序里面找到这个值
该值左边序列的就是左子树的先序遍历,右边的就是右子树的
然后在先序遍历中,数相同的长度
左子树的先序遍历,递归操作即可
#include<cstdio> #include<algorithm> #include<cstdlib> using namespace std; typedef struct Node* Tree; struct Node{ Tree lt,rt; char v; }; int ans; char xx[55],zx[55]; Tree MakeNode(){ Tree T=(Tree)malloc(sizeof(struct Node)); T->lt=T->rt=NULL; return T; } Tree MakeTree(int xh,int zh,int s){ Tree T=MakeNode(); T->v=xx[xh]; if(s==1)return T; for(int i=zh;i<=zh+s-1;i++){ if(xx[xh]==zx[i]){ if(i>zh)T->lt=MakeTree(xh+1,zh,i-zh); if(i<zh+s-1)T->rt=MakeTree(xh+i-zh+1,i+1,s-i+zh-1); } } return T; } void bl(Tree T,int h){ if(T->lt)bl(T->lt,h+1); if(T->rt)bl(T->rt,h+1); ans=ans>h?ans:h; } int main(){ int n; scanf("%d",&n); scanf("%s%s",xx,zx); Tree T=MakeTree(0,0,n); bl(T,1); printf("%d",ans); }
我是一颗水灵灵的大白菜,
农民伯伯辛勤的耕种着我,
把我带到了菜市场
拿着喷头对着我浇水,
还一边说“好菜啊好菜”