二叉树的节点个数以及高度详解(附图解)

二叉树的节点个数以及高度



前言

本文介绍二叉树的节点个数以及高度,每道题都附有源码+图解


NO.1 定义链式二叉树

代码如下(示例):

typedef char BTDataType;
typedef struct BinaryTreeNode
{
	struct BinaryTreeNode* left;
	struct BinaryTreeNode* right;
	BTDataType data;
}BTNode;

NO.2 创建二叉树

在这里插入图片描述

我们想要实现如图所示的链式二叉树,代码实现如下(把每一个节点都一一链接起来)

代码如下(示例):

BTNode* BuyNode(BTDataType x)
{
	BTNode* node = (BTNode*)malloc(sizeof(BTNode));
	if (node == NULL)
	{
		printf("malloc fail\n");
		exit(-1);
	}
	node->data = x;
	node->left = node->right = NULL;
	return node;
}
BTNode* CreatBinaryTree()
{
	BTNode* nodeA = BuyNode('A');
	BTNode* nodeB = BuyNode('B');
	BTNode* nodeC = BuyNode('C');
	BTNode* nodeD = BuyNode('D');
	BTNode* nodeE = BuyNode('E');
	nodeA->left = nodeB;
	nodeA->right = nodeC;
	nodeB->left = nodeD;
	nodeC->left = nodeE;
	return nodeA;
}

一、二叉树节点个数

我们刚创建完的二叉树中,节点个数有:5 个,下面是代码展示 + 递归图解

1.代码展示

代码如下(示例):

int BinaryTreeSize(BTNode* root)
{
	return root == NULL ? 0 :
		BinaryTreeSize(root->left)
		+ BinaryTreeSize(root->right)
		+ 1;
}

2.递归图解

在这里插入图片描述

在这里插入图片描述
这里这画出了A左节点的递归展开图,右节点递归展开图和下面差不多,感兴趣的可以自行画图!


在这里插入图片描述


二、二叉树叶子节点个数

叶子节点:度为0的节点被称为叶节点,比如我们双肩的二叉树中的D和E两个节点!

1.代码展示

代码如下(示例):

// 二叉树叶子节点个数
int BinaryTreeLeafSize(BTNode* root)
{
	if (root == NULL)
	{
		return 0;
	}
	if (root->left == NULL && root->right == NULL)
	{
		return 1;
	}
	return BinaryTreeLeafSize(root->left) + 
		BinaryTreeLeafSize(root->right);
}

2.递归图解

在这里插入图片描述

在这里插入图片描述
这里这画出了A左节点的递归展开图,右节点递归展开图和下面差不多,感兴趣的可以自行画图!


在这里插入图片描述


三、二叉树第k层节点个数

1.代码展示

代码如下(示例):

// 二叉树叶子节点个数
int BinaryTreeLeafSize(BTNode* root)
{
	if (root == NULL)
	{
		return 0;
	}
	if (root->left == NULL && root->right == NULL)
	{
		return 1;
	}
	return BinaryTreeLeafSize(root->left) + 
		BinaryTreeLeafSize(root->right);
}

2.递归图解

在这里插入图片描述

在这里插入图片描述
这里这画出了A左节点的递归展开图,右节点递归展开图和下面差不多,感兴趣的可以自行画图!


在这里插入图片描述


四、二叉树高度和深度

树的高度或深度:树中节点的最大层次。我们构建的二叉树的高度或深度为 4

1.代码展示

代码如下(示例):

// 二叉树深度/高度
int BinaryTreeDepth(BTNode* root)
{
	if (root == NULL)
	{
		return 0;
	}
	//return BinaryTreeDepth(root->left) > BinaryTreeDepth(root->right) 
	/*? BinaryTreeDepth(root->left) + 1 
		: BinaryTreeDepth(root->right) + 1;*/
	int leftDepth = BinaryTreeDepth(root->left);
	int rightDepth = BinaryTreeDepth(root->right);
	return leftDepth > rightDepth ? leftDepth + 1 : rightDepth + 1;
}

2.递归图解

在这里插入图片描述

在这里插入图片描述
这里这画出了A左节点的递归展开图,右节点递归展开图和下面差不多,感兴趣的可以自行画图!


在这里插入图片描述


五、二叉树查找值为x的节点

1.代码展示

代码如下(示例):

// 二叉树查找值为x的节点
BTNode* BinaryTreeFind(BTNode* root, BTDataType x)
{
	if (root == NULL)
		return NULL;
	if (root->data == x)
		return root;
	BTNode* leftRet = BinaryTreeFind(root->left, x);
	if (leftRet)
		return leftRet;
	BTNode* rightRet = BinaryTreeFind(root->right, x);
	if (rightRet)
		return rightRet;
	return NULL;
	//return BinaryTreeFind(root->right, x);
}

2.递归图解

在这里插入图片描述
这里这画出了A左节点的递归展开图,右节点递归展开图和下面差不多,感兴趣的可以自行画图!


在这里插入图片描述


总结

以上就是今天要讲的内容,本文介绍二叉树的节点个数以及高度以及各自的递归展开图!
如果我的博客对你有所帮助记得三连支持一下,感谢大家的支持!
在这里插入图片描述

  • 15
    点赞
  • 22
    收藏
    觉得还不错? 一键收藏
  • 6
    评论
可以使用递归的方式实现查找二叉树结点个数。具体实现如下: ```c #include <stdio.h> #include <stdlib.h> // 定义二叉树结点结构体 struct TreeNode { int val; struct TreeNode *left; struct TreeNode *right; }; // 创建二叉树结点 struct TreeNode* createNode(int val) { struct TreeNode* node = (struct TreeNode*)malloc(sizeof(struct TreeNode)); node->val = val; node->left = NULL; node->right = NULL; return node; } // 递归查找二叉树结点个数 int countNodes(struct TreeNode* root) { if (root == NULL) { return 0; } // 左子树结点个数 + 右子树结点个数 + 1(根结点) return countNodes(root->left) + countNodes(root->right) + 1; } int main() { // 创建一棵二叉树 struct TreeNode* root = createNode(1); root->left = createNode(2); root->right = createNode(3); root->left->left = createNode(4); root->left->right = createNode(5); root->right->left = createNode(6); // 查找二叉树结点个数 int count = countNodes(root); printf("The number of nodes in the binary tree is: %d\n", count); return 0; } ``` 在上面的代码中,我们定义了一个 `countNodes` 函数,该函数使用递归的方式查找二叉树结点个数。如果当前结点为空,则返回 0;否则,递归计算左子树结点个数、右子树结点个数以及根结点,最后将三者相加即为二叉树结点个数。在 `main` 函数中,我们创建了一棵二叉树,并调用 `countNodes` 函数查找结点个数,最后输出结果。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 6
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值