7-23 还原二叉树 (25分)
Posted ACM比赛整理
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了7-23 还原二叉树 (25分)相关的知识,希望对你有一定的参考价值。
7-23 还原二叉树 (25分)
给定一棵二叉树的先序遍历序列和中序遍历序列,要求计算该二叉树的高度。
输入格式:
输入首先给出正整数N(50),为树中结点总数。下面两行先后给出先序和中序遍历序列,均是长度为N的不包含重复英文字母(区别大小写)的字符串。
输出格式:
输出为一个整数,即该二叉树的高度。
输入样例:
9
ABDFGHIEC
FDHGIBEAC
输出样例:
5
代码:
#include<iostream>
#include<cstdio>
#include<cstring>
#include<cmath>
using namespace std;
struct node {
char data;
node* lchild;
node* rchild;
};
int n;
char pre[100], in[100];
//当前先序序列区间为[preL, preR], 中序序列区间为[inL, inR], 返回根结点地址
node* create(int preL, int preR, int inL, int inR)
{
if(preL > preR) //先序序列长度小于等于0时,直接返回
return NULL;
node* root = new node; //新建一个新的结点,用来存放当前二叉树的根结点
root->data = pre[preL]; //新结点的数据域为根结点的值
int k;
for(k = inL; k <= inR; k++)
if(in[k] == pre[preL]) //在中序序列中找到in[k]==pre[L]的结点
break;
int numLeft = k-inL; //左子树的结点个数
//左子树的先序区间为[preL+1,preL+numLeft], 中序区间为[inL,k-1]
//返回左子树的根结点地址,赋值给root的左指针
root->lchild = create(preL+1, preL+numLeft, inL, k-1);
//右子树的先序区间为[preL+numLeft+1,preR], 中序区间为[k+1,inR]
//返回右子树的根结点地址,赋值给root的右指针
root->rchild = create(preL+numLeft+1 , preR, k+1, inR);
return root; //返回根结点地址
}
int TreeDepth(node* T)
{
if(T==NULL) return 0;
int LD = TreeDepth(T->lchild);
int RD = TreeDepth(T->rchild);
return (LD>RD?LD:RD)+1;
}
int main()
{
scanf("%d", &n);
scanf("%s", pre);
int len1 = strlen(pre);
scanf("%s", in);
int len2 = strlen(in);
node* T = create(0, len1-1, 0, len2-1);
printf("%d\n", TreeDepth(T));
return 0;
}
以上是关于7-23 还原二叉树 (25分)的主要内容,如果未能解决你的问题,请参考以下文章