题目
写一个算法求一棵二叉树的深度,二叉树以二叉链表为存储方式。
分析
假如已知一棵二叉树的左子树和右子树的深度,如何算出整棵树的深度呢?这是问题的关键。如果 有一棵二叉树,左子树深度为LD,右子树深度为RD,则整棵树的深度就是max{LD,RD}+1,即左子树 与右子树深度的最大值加上1, 这个结论是显然的。因此这个求深度的过程就是先求左子树深度,再求 右子树的深度,然后返回的两者之中的最大值加1就是整棵树的深度。这正对应于先遍历左子树(得到 左子树的深度LD), 再遍历右子树(得到右子树的深度RD),最后访问根(得到整棵树的深度为 max{LD,RD}+1) 的后序遍历方式。
代码
核心代码:
/* 求二叉树的深度 */
int getDepth(BTNode *p) {
if(p==NULL) {
return 0;// 如果是空树,则深度为0
} else {
int LD=getDepth(p->lchild);// 求左子树的深度
int RD=getDepth(p->rchild);// 求右子树的深度
if(LD>RD) { // 返回左右子树深度的最大值加1,即求整棵树的深度
return LD+1;// 1即是根节点
} else {
return RD+1;
}
}
}
完整代码:
#include<stdio.h>
#include<stdlib.h>
#include<string.h>
#include<assert.h>
/* 数结构体类型定义*/
typedef struct BTNode {
char data;// 这里默认结点data域为char类型
struct BTNode *lchild;// 左孩子指针域
struct BTNode *rchild;// 右孩子指针域
} BTNode,*BiTree;
/* 根据输入创建二叉树 */
/* 例:ABC##DE##F##GH### */
void CreatBiNode(BTNode **Node) { //此处应注意传递的参数(二重指针)
char data;
scanf("%c", &data);
*Node = (BiTree)malloc(sizeof(BTNode));
if (data == '#') {
*Node = NULL;
} else if ((data != '#') && (*Node)) {
(*Node)->data = data;
(*Node)->lchild = NULL;
(*Node)->rchild = NULL;
CreatBiNode(&(*Node)->lchild);
CreatBiNode(&(*Node)->rchild);
}
}
/* 求二叉树的深度 */
int getDepth(BTNode *p) {
if(p==NULL) {
return 0;// 如果是空树,则深度为0
} else {
int LD=getDepth(p->lchild);// 求左子树的深度
int RD=getDepth(p->rchild);// 求右子树的深度
if(LD>RD) { // 返回左右子树深度的最大值加1,即求整棵树的深度
return LD+1;// 1即是根节点
} else {
return RD+1;
}
}
}
int main() {
printf("先序输入二叉树(空结点用'#'表示):");
BiTree T=NULL;
CreatBiNode(&T);// 创建二叉树
/* 求表达式的值 */
int r=getDepth(T);
printf("%d",r);
return 0;
}
以下图为例输入(其中空结点用“#”表示),输入的字符串如下:
运行结果: