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

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);
}

 







posted @ 2020-09-07 18:06  幽灵轩  阅读(564)  评论(0编辑  收藏  举报