5-1 还原二叉树 (25分)

来源:互联网 发布:移动硬盘监控软件 编辑:程序博客网 时间:2024/05/17 09:06

给定一棵二叉树的先序遍历序列和中序遍历序列,要求计算该二叉树的高度。

输入格式:

输入首先给出正整数N(\le50),为树中结点总数。下面两行先后给出先序和中序遍历序列,均是长度为N的不包含重复英文字母(区别大小写)的字符串。

输出格式:

输出为一个整数,即该二叉树的高度。

输入样例:

9ABDFGHIECFDHGIBEAC

输出样例:

5

代码如下:同学们直接复制是不行了,记到解水印,但是你水印都不会解的话,那答案。。。。。。。。。。。。。。。

#include<stdio.h>
#include<string.h>
#include<stdlib.h>
typedef struct node{
    char data;
    struct node *left,*right;
}*Tree;
//递归创建树
Tree createTree(char *pre,char *ino,int n){//传入先序变量,中序遍历,和有多少个元素
    Tree root=NULL;//初始话双亲节点
    int i=0;//定义一个初始化值为0的计数器
    int pl=0,pr=0;//初始化先序的左孩子数和右孩子数
    int il=0,ir=0;//初始化中序的左孩子数和右孩子数
    char lpre[50],rpre[50];//定于先序左,右孩子的分别所占的总个数
    char lino[50],rino[50];//定于先序左,右孩子的分别所占的总个数
    if(n==0){
        return NULL;//如果传入的总个数为0返回NULL
    }
    root=(Tree)malloc (sizeof(struct node));//申请存储空间
    if(root==NULL){
        return NULL;//返回为空
    }
    memset(root,0,sizeof(struct node));
    root->data=pre[0];//先序的第一个是根节点
    //将中序遍历分割为两个数组
    for(i=0;i<n;i++){
        if((i<=il)&&(ino[i]!=pre[0])){//得到左孩子的数
            lino[il++]=ino[i];//左孩子装到左数组中
        }else if(ino[i]!=pre[0]){
            rino[ir++]=ino[i];//右孩子装到左数组中
        }
    }
    //由于左右孩子的个数相同,所以可以得到分割后的先序数组
    for(i=1;i<n;i++){
        if(i<(il+1)){
            lpre[pl++]=pre[i];//将左孩子装在一个数组中
        }else{
            rpre[pr++]=pre[i];//将右孩子装在一个数组中
        }
    }
    root->left=createTree(lpre,lino,il);//创建左边孩子
    root->right=createTree(rpre,rino,ir);//创建右孩子
    return root;//返回根结点
}
//先序遍历,底层为递归算法
void preorder(Tree b){
    if(b==NULL){
        return ;
    }else{
    printf("%c",b->data);//输出对应的结果
    preorder(b->left);//向左递归查找
    preorder(b->right);//向右递归查找
    }
}
//计算树的高度是多少
int highTree(Tree b){
    int left=0,max=0,right=0;//初始化左,最大值,右指数为0
    if(b){
        left=highTree(b->left);//递归调用该方法
        right=highTree(b->right);//递归调用该方法
        max=(left>right)?left:right;//比较两个的大小
        return (max+1);//返回最大值
    }else{
        return 0;//失败返回0
    }
}
int main(){
    char preNode[50];
    char inNode[50];
    int n = 0;  //用来统计数
    int count=0;
    char ch;
    scanf("%d",&count);
    Tree root=NULL;
    getchar();//吃空格
    while((ch = getchar())&&ch!='\n')
        preNode[n++] = ch;
    n = 0;  //初始化,为下一次计数做准备
    while((ch = getchar())&&ch!='\n')
        inNode[n++] = ch;
    root = createTree(preNode,inNode,n);
//    preorder(root); //打印输出
    int max=0;
    max=highTree(root);//得到树的高度
    printf("%d",max);//打印树的高度
    return 0;


}

0 0