数据结构实验之二叉树四:还原二叉树
Time Limit: 1000MS Memory limit: 65536K
题目描述
给定一棵二叉树的先序遍历序列和中序遍历序列,要求计算该二叉树的高度。
输入
输入数据有多组,每组数据第一行输入
1
个正整数
N(1 <= N <= 50)
为树中结点总数,随后
2
行先后给出先序和中序遍历序列,均是长度为
N
的不包含重复英文字母
(
区分大小写
)
的字符串。
输出
输出一个整数,即该二叉树的高度。
示例输入
9 ABDFGHIEC FDHGIBEAC
示例输出
5
#include <stdio.h>
#include <string.h>
#include <stdlib.h>
typedef char telemtype;
typedef char status;
typedef struct bitnode
{
telemtype data;
struct bitnode *lchild, *rchild;
}*bitree;
void BinaryTree(bitree& t, char pre[], char ino[],int ps, int is, int length)//ps:前序序列起始位置
//is:中序序列起始位置
{
if (length==0) t=NULL;
else
{
int k=0;
int n = strlen(ino);
for(k=0; k<n; k++)//找到根节点在中序序列中的位置,用以划分左右子树
{
if(ino[k]==pre[ps])//前序序列的第一个元素即为根节点
break;
}
t= new bitnode;
if (!t) exit(0);
t->data = pre[ps];
if (k==is) t->lchild = NULL;//若前序中根结点在中序左子树序列的起始位置,则此结点左子树为空
else BinaryTree(t->lchild, pre, ino, ps+1, is, k-is);
if (k==is+length-1) t->rchild = NULL;
else BinaryTree(t->rchild, pre, ino, ps+1+(k-is), k+1, length-(k-is)-1);
}
}
int depth(bitree t)
{
int ld, rd;
if(!t) return 0;
else
{
ld=depth(t->lchild);
rd=depth(t->rchild);
if(ld>rd)
return ld+1;
else
return rd+1;
}
}
int main()
{
char pre[55], ino[55];
int m;
bitree t;
while(~scanf("%d", &m))
{
scanf("%s", pre);
scanf("%s", ino);
BinaryTree(t, pre, ino, 0, 0, m);
printf("%d\n", depth(t));
}
}