还原二叉树 [2018秋DS mooc期末]

7-23 还原二叉树 (25 分)

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

输入格式:

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

输出格式:

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

输入样例:

9
ABDFGHIEC
FDHGIBEAC

输出样例:

5

My code:

#include <stdio.h>
#include <stdlib.h>
#include <math.h>

#define MAX 500

int search(int *a, int x, int N)
{
    for(int i=0; i<N; i++){
        if(a[i]==x) return i;
    }
    return -1;
}

void buildtree(int length, int i, int *pre, int *in, double *max)
{
    if(length==0) return;
    int root = pre[0];
    //T[i] = root;
    if(i>*max) *max=i;

    int rootin = search(in, root, length);

    int Llength, Rlength;
    Llength = rootin;
    Rlength = length-1-Llength;

    buildtree(Llength, 2*i, pre+1, in, max);
    buildtree(Rlength, 2*i+1, pre+Llength+1, in+rootin+1, max);

}

int main(void)
{
    int N;

    scanf("%d", &N);
    int pre[MAX+1], in[MAX+1];

    getchar();

    for(int i=0; i<N; i++){
        pre[i] = getchar()-'A';
    }
    getchar();
    for(int i=0; i<N; i++){
        in[i] = getchar()-'A';
    }

    double ans=1;
    buildtree(N, 1, pre, in, &ans);

    ans = log(ans)/log(2)+1;
    printf("%d\n", (int)ans);

    return 0;
}

注:尝试用非递归写但是最后发现想法不对,用递归写很简单。
参考:(https://blog.csdn.net/m0_37698652/article/details/79218014)

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值