6-1 求二叉树高度(20 分)
本题要求给定二叉树的高度。
函数接口定义:
int GetHeight( BinTree BT );
其中BinTree
结构定义如下:
typedef struct TNode *Position;
typedef Position BinTree;
struct TNode{
ElementType Data;
BinTree Left;
BinTree Right;
};
要求函数返回给定二叉树BT的高度值。
裁判测试程序样例:
#include <stdio.h>
#include <stdlib.h>
typedef char ElementType;
typedef struct TNode *Position;
typedef Position BinTree;
struct TNode{
ElementType Data;
BinTree Left;
BinTree Right;
};
BinTree CreatBinTree(); /* 实现细节忽略 */
int GetHeight( BinTree BT );
int main()
{
BinTree BT = CreatBinTree();
printf("%d\n", GetHeight(BT));
return 0;
}
/* 你的代码将被嵌在这里 */
输出样例(对于图中给出的树):
4
#include <stdio.h>
#include <stdlib.h>
typedef char ElementType;
typedef struct TNode *Position;
typedef Position BinTree;
struct TNode {//结点结构
ElementType Data;
BinTree Left;
BinTree Right;
};
BinTree CreatBinTree(); //创建树,题目不要求实现,为了理解,我还是实现了他
int GetHeight(BinTree BT);//递归输出
int main(void)
{
BinTree BT = CreatBinTree();
printf("%d\n", GetHeight(BT));
return 0;
}
BinTree CreatBinTree()
{//层序生成二叉树
//特殊限制,输入为0的时候为叶节点
BinTree BT;
ElementType T;
int front = 0, tail = 0;
BinTree Queue[1001] = { '\0' };//父节点数列
BinTree Date;
scanf("%c", &T);
if (T == '0')//空树
return NULL;
else
{
BT = (BinTree)malloc(sizeof(struct TNode));
if (BT == NULL)
return NULL;
BT->Data = T;//根节点赋值
BT->Left = BT->Right = NULL;//初始化左右子树
Queue[tail++] = BT;
}
while (Queue[front]!=NULL) {//根节点入队列
Date = Queue[front++];
scanf("%c", &T);
if (T == '0')
Date->Left = NULL;
else
{
Date->Left = (BinTree)malloc(sizeof(struct TNode));
if (Date->Left == NULL)//先完成左树的操作,然后完成右树的操作
return NULL;
Date->Left->Data = T;
Date->Left->Left = Date->Left->Right = NULL;
Queue[tail++] = Date->Left;
}
scanf("%c", &T);
if (T == '0')
Date->Right = NULL;
else
{
Date->Right = (BinTree)malloc(sizeof(struct TNode));
if (Date->Right == NULL)
return NULL;
Date->Right->Data = T;
Date->Right->Left = Date->Right->Right = NULL;
Queue[tail++] = Date->Right;
}
};
return BT;
}
int GetHeight(BinTree BT)//递归方法
{
int LH, RH;//对左右子树的高度进行记录
if (!BT)//末位,递归停止
return 0;
else
{
LH = GetHeight(BT->Left);
RH = GetHeight(BT->Right);
return LH > RH ? ++LH : ++RH;//返回左右子树中值最大的,再加上当前父节点,因为不会统计父节点
}
}