Problem Description
给定一棵二叉树的先序遍历序列和中序遍历序列,要求计算该二叉树的高度。
Input
输入数据有多组,每组数据第一行输入1个正整数N(1 <= N <= 50)为树中结点总数,随后2行先后给出先序和中序遍历序列,均是长度为N的不包含重复英文字母(区分大小写)的字符串。
Output
输出一个整数,即该二叉树的高度。
Example Input
9 ABDFGHIEC FDHGIBEAC
Example Output
5
#include<stdio.h> #include<string.h> #include<stdlib.h> #define ERROR -1 #define OK 1 typedef char TElemtype; typedef int Statu; typedef struct BiTnode { TElemtype data; struct BiTnode *lchild, *rchild; }BiTnode, *BiTree; int Prin(BiTree T); //求深度 BiTree CreateBiTree(TElemtype pre[], TElemtype inorder[], int len); //建树 int main() { char inorder[55], pre[55]; int n; while(~scanf("%d", &n)) { scanf("%s%s", pre, inorder); BiTree T; T = CreateBiTree(pre, inorder, n); n = Prin(T); printf("%d\n", n); } return 0; } int Prin(BiTree T) { int d, l, r; if(!T) //节点为空时此节点深度为0 d = 0; else { l = Prin(T -> lchild); r = Prin(T -> rchild); d = 1 + (l > r ? l : r); //根节点的深度为左子树 右子树较大的深度加一 } return d; } BiTree CreateBiTree(TElemtype pre[], TElemtype inorder[], int len) { int i; if(!len) { return NULL; } BiTree T; for(i = 0; i < len; i++) { if(pre[0] == inorder[i]) break; } T = (BiTree)malloc(sizeof(BiTnode)); T -> data = pre[0]; T -> lchild = CreateBiTree(pre + 1, inorder, i); T -> rchild = CreateBiTree(pre + 1 + i, inorder + 1 + i, len - i - 1); return T; }