理论思路
(图来自浙大数据结构课程)
很明显,求树的高度,是左右子树中最高的再加一。
那么怎么求左子树的高度呢?就是其左右子树中最高的加一。
那么怎么求右子树的高度呢?就是其左右子树中最高的加一。
这样就形成了 递归,我们利用后序遍历的程序,稍加修改便可成为求二叉树高度的程序。
求二叉树高度:
int PostOrderGetHeight(BinTree BT){
int HL,HR,MaxH;
if(BT){
HL=PostOrderGetHeight(BT->Left);
HR=PostOrderGetHeight(BT->Right);
MaxH=HL > HR ? HL : HR;
return (MaxH+1);
}else{
return 0;
}
}
理解:
碰到叶子节点时,HL和HR的值都为0,最后返回时,叶子节点的高度就是1。
然后将这个高度原路返回给父节点的HL或者HR。
C代码实现
1.利用前序遍历思想创建二叉树
2.求二叉树的高度
#include <stdio.h>
#include <stdlib.h>
typedef char DataType;
typedef struct Node *BinTree;
typedef BinTree NodeLink;
typedef struct Node TreeNode;
struct Node{
DataType data;
NodeLink Left,Right;
};
void creat_BinTree(BinTree *T){
char ch;
scanf("%c",&ch);
if(ch=='#'){
*T=NULL;
}else{
*T=(TreeNode*)malloc(sizeof(TreeNode));
(*T)->data=ch;
(*T)->Left=NULL;
(*T)->Right=NULL;
creat_BinTree(&((*T)->Left));
creat_BinTree(&((*T)->Right));
}
}
int PostOrderGetHeight(BinTree BT){
int HL,HR,MaxH;
if(BT){
HL=PostOrderGetHeight(BT->Left);
HR=PostOrderGetHeight(BT->Right);
MaxH=HL > HR ? HL : HR;
return (MaxH+1);
}else{
return 0;
}
}
int main(int argc, char *argv[]) {
BinTree Tree;
creat_BinTree(&Tree);
int h=PostOrderGetHeight(Tree);
printf("树的高度:%d",h);
return 0;
}
二叉树如下: