• 51 还原二叉树 (25分)


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

    输入格式:

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

    输出格式:

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

    输入样例:

    9
    ABDFGHIEC
    FDHGIBEAC
    

    输出样例:

    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;


    }

  • 相关阅读:
    最大流基础
    转一篇写期望的日志
    poj3267The Cow Lexicon(dp)
    poj3026Borg Maze(bfs+MST)
    poj2226Muddy Fields(二分图的最小点覆盖)
    poj1035Spell checker(字符串模拟)
    poj1422Air Raid(最小路径覆盖)
    poj3020Antenna Placement(最小路径覆盖)
    [JSOI2009]火星藏宝图
    [SHOI2007]书柜的尺寸
  • 原文地址:https://www.cnblogs.com/csnd/p/16675693.html
Copyright © 2020-2023  润新知