本题要求给定二叉树的高度。
函数接口定义:
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() { BinTree BT = CreatBinTree(); printf("%d\n", GetHeight(BT)); return 0; } BinTree CreatBinTree() {//层序生成二叉树 BinTree BT; ElementType T; int front = 0; int tail = 0; BinTree Queue[1001] = { '\0' };//父节点数列,'\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->Left == 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;//返回左右子树中值最大的,因为不会统计父节点,所以要再加上当前父节点 } }