给定一棵二叉树的先序遍历序列和中序遍历序列,要求计算该二叉树的高度。
输入格式:
输入首先给出正整数N(≤50),为树中结点总数。下面两行先后给出先序和中序遍历序列,均是长度为N的不包含重复英文字母(区别大小写)的字符串。
输出格式:
输出为一个整数,即该二叉树的高度。
输入样例:
9
ABDFGHIEC
FDHGIBEAC
输出样例:
5
先序遍历的顺序为:根->左子树->右子树
中序遍历的顺序为:左子树->根->右子树
后序遍历的顺序为:左子树->右子树->根
这里用到了全局变量定义数组,从而在递归时只需要传递下标值而无需传递数组。
因为本题就是求高度,不涉及节点的数据,所以没有必要在结构体中定义data,需要建立树的结构即可。
先序第一个数据必是树根,通过检索其在中序数组中的位置,将中序数组划分为左子树和右子树,同时根据左右字数节点的个数,将先序序列划分为左右子树。这样进行完一次的划分后,就确定了左右子树的先序和中序顺序,利用递归将其划分下去。同时需要考虑何时不会有左右子树,答案显而易见,就是利用根把中序数组划分后无剩余元素。
#include<stdio.h>
#include<stdlib.h>
typedef struct node* Ptr;
struct node{
Ptr left;
Ptr right;
};
char pre[50],in[50];
int num;
//四个参数分别为先序、中序数组下标的最小、最大值
Ptr Restore( int preMin, int preMax, int inMin, int inMax);
int GetHeight( Ptr head);
int main(void){
Ptr BT;
int height;
scanf("%d", &num);
scanf("%s", pre);
scanf("%s", in);
BT = Restore( 0, num - 1, 0, num - 1);
height = GetHeight( BT);
printf("%d", height);
return 0;
}
Ptr Restore( int preMin, int preMax, int inMin, int inMax){
Ptr root;
int i;
root = (Ptr)malloc(sizeof(struct node));
root->left = root->right = NULL;
for( i = inMin; i <= inMax; i++){
if( pre[preMin] == in[i]){
if( i != inMin) root->left = Restore( preMin + 1, preMin + inMin - 1, inMin, i - 1); //在子树有剩余的
if( i != inMax) root->right = Restore( preMin + i - inMin + 1, preMax, i + 1, inMax);//进情况下行操作
break;
}
}
return root;
}
int GetHeight( Ptr head){
int hl, hr, max;
if( head == NULL) return 0;
else{
hl = GetHeight( head->left);
hr = GetHeight( head->right);
max = hl > hr ? hl : hr;
}
return max + 1;
}