先序中序遍历__还原二叉树

合集下载
  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。

先序中序遍历__还原⼆叉树
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);
}。

相关文档
最新文档