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

原创 2016年08月30日 09:19:39

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

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

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

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

输入样例:

9
ABDFGHIEC
FDHGIBEAC

输出样例:

5

思路
大致上是利用了先序和中序遍历机制。结合递归算法算出最深一层是第几层,也就是此二叉树的高度。

点击访问 PTA-测验

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

/* 评测结果 
时间  结果  得分  题目  编译器     用时(ms)  内存(MB)  用户
2016-08-30 09:15    答案正确    25  5-23    gcc     4   1   569985011
测试点结果 
测试点     结果  得分/满分   用时(ms)  内存(MB)
测试点1    答案正确    12/12   4   1
测试点2    答案正确    3/3     1   1
测试点3    答案正确    3/3     1   1
测试点4    答案正确    1/1     1   1
测试点5    答案正确    6/6     1   1
查看代码*/

char* ReadData(const int number);
int Found(char );
int Function(int ,int);

char *preorder;
char *inorder;
int Usedorder[51];

int main() {
    int n;
    scanf("%d",&n);
    preorder=ReadData(n);
    inorder=ReadData(n);
    for(int i=0; i<n; i++) {
        Usedorder[i]=0;
    }
    printf("%d",Function(0,n-1));





    return 0;
}

int Function(int left,int right) {

//printf("%d-%d",left,right);
    if(left<right) {
        int index=Found(preorder[left]);
        if(index==-1) {
            printf("ERROR!\n");
            return -999;
        }
        Usedorder[index]=1;
        int LeftSon=0;
        for(int j=index-1; j>=0; j--) {
            if(Usedorder[j])break;
            LeftSon++;
        }
//      printf("{");
//      for(int i=left; i<=right; i++) {
//          if(i==left+LeftSon)printf("|");
//          printf("%c",inorder[i]);
//          if(i==left+LeftSon)printf("|");
//      }
//      printf("}\n");


        int leftTree=Function(left+1,left+LeftSon);
//      printf("|");
        int rightTree=Function(left+1+LeftSon,right);
//      printf("\n");
        return (leftTree>rightTree?leftTree:rightTree)+1;
    }
    return 1;
}

char* ReadData(const int n) {
    getchar();
    char *a=(char*)malloc(sizeof(char)*51);
    for(int i=0; i<n; i++) {
        scanf("%c",&a[i]);
    }
    a[n]='\0';
//  printf("ReadData{");
//  for(int i=0; i<strlen(a); i++)printf("%c",a[i]);
//  printf("}\n");
    return a;
}


int Found(char a) {

    for(int i=0; i<strlen(inorder); i++) {
        if(inorder[i]==a)return i;
    }

    return -1;
}
版权声明:写这些东西还是问了交流进步,如果你有不同的方法、见解,欢迎交流分享。文章中附的代码只传达当时我的一种做法,并非我认为最好的。

根据前序遍历序列和中序遍历序列构造二叉树算法

一个前序遍历序列和一个中序遍历序列可以确定一颗唯一的二叉树。        根据前序遍历的特点, 知前序序列(PreSequence)的首个元素(PreSequence[0])为二叉树的根(root)...
  • yunzhongguwu005
  • yunzhongguwu005
  • 2013年07月08日 11:37
  • 30614

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

5-23 还原二叉树   (25分) 给定一棵二叉树的先序遍历序列和中序遍历序列,要求计算该二叉树的高度。 输入格式: 输入首先给出正整数N(\le≤50),为树中结点总数。下面...
  • m0_37286282
  • m0_37286282
  • 2017年06月09日 23:36
  • 95

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

给定一棵二叉树的先序遍历序列和中序遍历序列,要求计算该二叉树的高度。 输入格式: 输入首先给出正整数N(≤50),为树中结点总数。下面两行先后给出先序和中序遍历序列,均是长度为N的不包含重...
  • hou_blog
  • hou_blog
  • 2015年12月02日 22:13
  • 2316

由先序序列和中序序列生成一棵二叉树

#include #include #include typedef struct BiTNode{ char e; struct BiTNode *lchild,*rchild; ...
  • o1101574955
  • o1101574955
  • 2015年02月17日 14:32
  • 1827

数据结构实验之二叉树四:还原二叉树

数据结构实验之二叉树四:还原二叉树 Time Limit: 1000ms   Memory limit: 65536K  有疑问?点这里^_^ 题目描述 给定一棵二叉树的先序...
  • guoqingshuang
  • guoqingshuang
  • 2015年11月11日 09:56
  • 1933

二叉树三种遍历及还原

图一 先序:根左子树 右子树 从头结点开始ABDECF 规律:最左边的元素是这个二叉树最顶层节点。也就是A 中序:左子树根 右子树 从最后一层叶子节点开始遍历:DBEAFC 规律:从整体来讲A在树...
  • hemerry
  • hemerry
  • 2016年10月28日 17:54
  • 992

pat--还原二叉树--根据后序中序输出先序

还原二叉树   (25分) 给定一棵二叉树的先序遍历序列和中序遍历序列,要求计算该二叉树的高度。 输入格式: 输入首先给出正整数N(≤\le≤50),为树中结点总数。下面两行先后...
  • shengsikandan
  • shengsikandan
  • 2016年04月18日 19:58
  • 1399

pta 还原二叉树

5-3 还原二叉树   (25分) 给定一棵二叉树的先序遍历序列和中序遍历序列,要求计算该二叉树的高度。 输入格式: 输入首先给出正整数N(\le≤50),为树中结点总数。下面两...
  • yjf3151731373
  • yjf3151731373
  • 2016年07月12日 17:08
  • 578

5-23 还原二叉树

先序和中序遍历还原二叉树,并求树高
  • u014376961
  • u014376961
  • 2016年07月25日 10:28
  • 921

5-23 还原二叉树

给定一棵二叉树的先序遍历序列和中序遍历序列,要求计算该二叉树的高度。 输入格式: 输入首先给出正整数N(\le≤50),为树中结点总数。下面两行先后给出先序和中序遍历序列,均是长度为N的不...
  • wxf2012301351
  • wxf2012301351
  • 2017年04月18日 21:29
  • 286
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:5-23 还原二叉树 (25分)
举报原因:
原因补充:

(最多只允许输入30个字)