使用递归的方法求树高的思路:
主要有两个问题需要解决:
第一,树的高度如何表示和计算
第二,树的分支如何处理
对于第一个问题,求树的高度可以分解为求树的子树的高度再加1,子树的高度同样等于子树的子树的高度加1,这样就可以一层一层的向下分解,直到最后一层叶子节点,它没有左右子树了,这时它的高度是1,这也就是递归终止条件,然后向上返回树的高度。
对于第二个问题,当树只有左子树或者右子树时,直接求对应子树的高度即可,如果左右子树都存在的话,就需要判断左子树和右子树哪个高,返回更高的数值。
例:
程序流程:
判断节点1有两个子树,需要分别求出这两个子树的高度;程序进入节点1的左子节点2
判断节点2有两个子树,分别求出这两个子树的高度,程序进入节点2的左子节点4
判断节点4没有左右子树,返回1,程序回到节点2,程序进入节点2的右子节点5
判断节点5没有左右子树,返回1,程序回到节点2,判断节点2的左子树高度1和右子树高度1相同,返回树高1+1,程序回到节点1,程序进入节点1的右子节点3
判断节点3没有左右子树,返回1,程序回到节点1,判断节点1的左子树高度2和右子树高度1,返回树高2+1,程序结束
求树高代码:
typedef int ElementType;
typedef struct TreeNode* Tree;
struct TreeNode{
ElementType Data;
Tree Lift;
Tree Right;
};
int max(int a,int b){
return ((a>b)?a:b);
}
int TreeHeight(Tree T){
if(T->Right==NULL && T->Lift!=NULL){
return (TreeHeight(T->Lift)+1);
}
else if(T->Lift==NULL && T->Right!=NULL){
return (TreeHeight(T->Right)+1);
}
else if(T->Lift!=NULL && T->Right!=NULL){
return max((TreeHeight(T->Lift)+1),(TreeHeight(T->Right)+1));
}
else
return 1;
}