给定一棵二叉树的先序遍历序列和中序遍历序列,要求计算该二叉树的高度。
输入样例:
输入首先给出正整数N(≤50),为树中结点总数。下面两行先后给出先序和中序遍历序列,均是长度为N的不包含重复英文字母(区别大小写)的字符串。
9
ABDFGHIEC
FDHGIBEAC
输出样例:
5
解题思路:
已知先序序列和中序序列确定树的结构:
先建立一个树根节点,先序序列的第一个即为树根节点。确定树根后,遍历中序序列找到树根节点,树根节点的左边的序列即为树根左孩子的中序序列,右边为右孩子的中序序列。计算左孩子的节点个数n,右孩子节点个数m,遍历先序序列的根节点后的n个是左孩子的后续序列,再后面m个是右孩子的后序序列,根据左孩子和右孩子的先序和中序序列进行递归,最后建立一棵树。
#include<stdio.h>
#include<malloc.h>
typedef struct node
{
struct node *lchild, *rchild;
char data;
} BTNode;
BTNode* CreateBTree(char *pre, char *in, int n)
{
int k;
char *p;
if (n <= 0)
return NULL;
BTNode *b = (BTNode*)malloc(sizeof(BTNode));
b->data = *pre;
for (p = in; p < in + n; ++p)
if (*p == *pre)
break;
k = p-in;
b->lchild = CreateBTree(pre+1, in, k);
b->rchild = CreateBTree(pre+k+1, p+1, n-k-1);
return b;
}
int GetHeight(BTNode* BT)
{
int HL,HR,MaxH;
if(BT)
{
HL = GetHeight(BT->lchild);
HR = GetHeight(BT->rchild);
MaxH = HL > HR ? HL:HR;
return (MaxH + 1);
}
else return 0;
}
int main()
{
BTNode* b;
int h,n;
scanf("%d",&n);
char pre[n];
char in[n];
scanf("%s",pre);
scanf("%s",in);
b = CreateBTree(pre, in, n);
h = GetHeight(b);
printf("%d",h);
return 0;
}