考研数据结构之树(6.10)——练习题之求一棵二叉树的深度(C表示)

题目

写一个算法求一棵二叉树的深度,二叉树以二叉链表为存储方式。

分析

假如已知一棵二叉树的左子树和右子树的深度,如何算出整棵树的深度呢?这是问题的关键。如果 有一棵二叉树,左子树深度为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;
}

以下图为例输入(其中空结点用“#”表示),输入的字符串如下:

运行结果:

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值