【C语言】详解如何求一颗二叉树的深度及简单介绍下深度优先遍历及广度优先遍历

文章介绍了如何使用C语言模拟创建一个二叉树,并通过递归算法计算二叉树的深度。二叉树的深度是从根节点到最远叶子节点的最长路径上的边数。此外,文章还提及了深度优先遍历(DFS)和广度优先遍历(BFS)两种遍历方法。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

二叉树的模拟创建

         如果我们想知道一颗二叉树的深度是多少,那么我们首先得先创建一个二叉树对吧?

         

#define _CRT_SECURE_NO_WARNINGS
#include <stdio.h>
#include <assert.h>
#include <stdlib.h>
#include <time.h>



typedef  int BTDataType;//二叉树存放数据的类型

typedef struct BinaryTreeNode {//二叉树结构的定义

	struct BinaryTreeNode* left;//二叉树的左节点
	struct BinaryTreeNode* right;//二叉树的右节点
	BTDataType data;//二叉树的数据域

}BTNode;//将定义的二叉树结构名字重新简化定义



BTNode* BuyNode(BTDataType x) {//创建并且同时初始化二叉树的一个节点

	BTNode* node = (BTNode*)malloc(sizeof(BTNode));

	if (node == NULL) {
		printf("malloc fail!");
		exit(-1);
	}

	node->left = NULL;
	node->right = NULL;
	node->data = x;

	return node;
}

BTNode* CreatBinaryTree() {//模拟创建一个二叉树
	
	BTNode* node1 = BuyNode(1);
	BTNode* node2 = BuyNode(2);
	BTNode* node3 = BuyNode(3);
	BTNode* node4 = BuyNode(4);
	BTNode* node5 = BuyNode(5);
	BTNode* node6 = BuyNode(6);

	node1->left = node2;
	node1->right = node4;
	node2->left = node3;
	node4->left = node5;
	node4->right = node6;

	return node1;

}


int main(){

   BTNode* root =  CreatBinaryTree();//模拟创建一个二叉树

   return 0;

}

将以上代码运行,没问题的话,那么它应该就可以模拟实现一颗二叉树了。

如下图:

二叉树的深度

好了,到这里我们已经创建好了一颗二叉树,接下来我们就来求一求它的深度。

(二叉树的深度就是从根节点到最大一层节点的层数)

总体思路:

如果我们要求一颗二叉树的深度的话,那么我们根据二叉树深度的定义可知,深度就是指的是从二叉树的根节点到最大一层节点的层数。

那么我们就可以用递归和分治的思想来求。递归主要是为了求层数,分治通俗的来讲就是将大化小,将二叉树分为左右子树加上一个根节点。

所以,其求深度的重点就是分别利用递归求出左右子树的层数也就是深度,然后相比较一下左右子树的层数哪一个较大,然后较大的那一个加1就求出来了深度了。

代码如下:


int TreeDepth(BTNode* root) {
	
	if (root == NULL) {//如果这个树是空树的话,直接返回0就结束
		return 0;
	}

	//到这里就说明它不是一个空树
	int left = TreeDepth(root->left);//求其左树的层数
	int right = TreeDepth(root->right);//求其右树的层数

	return left > right ? left + 1 : right + 1;//利用三木运算符来比较,如果左树比右树高,则返回左树高度加一
	                                           //否则,返回右树的高度加一。
}



int main(){

   BTNode* root =  CreatBinaryTree();//模拟创建一个二叉树

   int depth = TreeDepth(root);
   
   printf("这颗树的深度为:%d", depth);


   return 0;

}

将其与上面创建好的树代码联合可以求出其结果了。

  代码图解

为了方便理解,这里再跟着画一遍递归图。

 

如果对代码有所不理解,可以看看递归的图,再看看代码,相信会方便于理解一点

深度优先遍历(DFS)和广度优先遍历(BFS)

深度优先遍历,其实拿二叉树的前序遍历来联合理解就行。比如,前序遍历不是从根节点的开始,一直遍历其左节点直至为空再返回根节点,然后再访问右节点么。简单理解就是一条道走到黑,不撞南墙不回头。

广度优先遍历,就是层序遍历。它以一个点为起点,从它的周围开始一圈一圈扩散着去遍历。就像一滴水滴到水面上荡起一层一层涟漪的那种感觉。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值