数据结构 ——— 计算链式二叉树叶子节点的个数以及计算链式二叉树的高度

目录

前言

链式二叉树示意图​编辑

手搓一个链式二叉树

计算链式二叉树的叶子节点个数

计算链式二叉树的高度


前言

上一章学习了计算链式二叉树的节点个数

数据结构 --------- 计算链式二叉树节点的个数-CSDN博客

接下来学习的是计算链式二叉树叶子节点的个数以及计算链式二叉树的高度


链式二叉树示意图


手搓一个链式二叉树

代码演示:

复制代码
// 数据类型
typedef int BTDataType;
 
// 二叉树节点的结构
typedef struct BinaryTreeNode
{
    BTDataType data; //每个节点的数据
 
    struct BinaryTreeNode* left; //指向左子树的指针
 
    struct BinaryTreeNode* right; //指向右子树的指针
}BTNode;
 
// 申请新节点
BTNode* BuyNode(BTDataType x)
{
    BTNode* newnode = (BTNode*)malloc(sizeof(BTNode));
 
    // 判断是否申请成功
    if (newnode == NULL)
    {
        perror("malloc fail");
        return NULL;
    }
 
    // 初始化
    newnode->data = x;
    newnode->left = NULL;
    newnode->right = NULL;
 
    return newnode;
}
 
BTNode* CreatBinaryTree()
{
    BTNode* n1 = BuyNode(1);
    assert(n1);
    BTNode* n2 = BuyNode(2);
    assert(n2);
    BTNode* n3 = BuyNode(3);
    assert(n3);
    BTNode* n4 = BuyNode(4);
    assert(n4);
    BTNode* n5 = BuyNode(5);
    assert(n5);
    BTNode* n6 = BuyNode(6);
    assert(n6);
 
    n1->left = n2;
    n1->right = n4;
    n2->left = n3;
    n4->left = n5;
    n4->right = n6;
 
    return n1;
}

计算链式二叉树的叶子节点个数

代码演示:

复制代码
int BtreeLeafSize(BTNode* root)
{
	if (root == NULL)
		return 0;

	if (root->left == NULL && root->right == NULL)
		return 1;

	return BtreeLeafSize(root->left) + BtreeLeafSize(root->right);
}

代码解析:

当 root 为空时,说明没有节点,返回 0

当 root 的 left 和 root 的 right 为空时,就说明 root 为叶子节点,返回 1

通过 BTreeLeafSize 函数递归找到二叉树的所有叶子节点

大致走读代码(以上图为例):

进入函数,root 为 1 节点,那么就会走 BTreeLeafSize(root->left)

直到走到 root 为 3 节点,root 的 left 和 root 的 right 都为空,那么说明当前 root 为叶节点

返回 1 ,注意:并不是直接返回,而是返回到上一层,也就是 root 为 2 节点时

因为 2 节点的 right 为空,所当 root 为 2 节点的 right 时,返回 0

返回到 root 为 节点 1 时,那么就会走 BTreeLeafSize(root->right)..................

最后递归完之后,返回的值,就是链式二叉树的叶子节点个数

代码验证:


计算链式二叉树的高度(分治算法)

代码演示:

复制代码
int BTreeHeight(BTNode* root)
{
	if (root == NULL)
		return 0;

	int leftHeight = BTreeHeight(root->left);
	int rightHeight = BTreeHeight(root->right);

	return leftHeight > rightHeight ? leftHeight + 1 : rightHeight + 1;
}

代码解析:

当 root 为空时,说明没有节点,返回 0

创建两个变量用来记录左右子树的节点高度

最后再比较,返回高的那个节点的高度,也就是整个二叉树的高度

大致走读代码(以上图为例):

进入函数,root 为 1 节点,先走 BTreeHeight(root->left)

直到 root 为 3 节点的 left 节点,为空返回 0,返回到 3 节点

再走 BTreeHeight(root->right) ,也就是 3 节点的 right 节点,同样为空返回 0

此时的 leftHeight 和 rightHeight 同样为 0,返回 0+1

也就是返回到 root 为 2 节点的时候,且 2 节点的 right 为空,返回 0

此时 2 节点的 leftHeight 为 1,rightHeight 为 0,比较后,返回 1+1

返回的 2 返回到 root 为 1节点的时候,再走 BTreeHeight(root->right)..................

直到递归走完,最后返回的结果就是左右子树比较大的值,也就是二叉树的高

代码验证:

相关推荐
软件派38 分钟前
基于YOLO算法的目标检测系统实现指南
算法·yolo·目标检测
代码小将3 小时前
Leetcode209做题笔记
java·笔记·算法
Musennn4 小时前
leetcode 15.三数之和 思路分析
算法·leetcode·职场和发展
CM莫问6 小时前
<论文>(微软)避免推荐域外物品:基于LLM的受限生成式推荐
人工智能·算法·大模型·推荐算法·受限生成
康谋自动驾驶7 小时前
康谋分享 | 自动驾驶仿真进入“标准时代”:aiSim全面对接ASAM OpenX
人工智能·科技·算法·机器学习·自动驾驶·汽车
C++ 老炮儿的技术栈8 小时前
什么是函数重载?为什么 C 不支持函数重载,而 C++能支持函数重载?
c语言·开发语言·c++·qt·算法
inputA8 小时前
【LwIP源码学习6】UDP部分源码分析
c语言·stm32·单片机·嵌入式硬件·网络协议·学习·udp
yychen_java8 小时前
R-tree详解
java·算法·r-tree
JANYI20189 小时前
嵌入式设计模式基础--C语言的继承封装与多态
java·c语言·设计模式
MarkHard1239 小时前
Leetcode (力扣)做题记录 hot100(62,64,287,108)
算法·leetcode·职场和发展