【数据结构】——二叉树特点

前言:我们前面已经了解了二叉树的一些概念,那么我们今天就来了解下二叉树的遍历实现和一些性质。

二叉树的遍历方式有三种:前序中序后序

前序:先根节点,再左子树,最后右子树。

中序:先左子树,再根节点,最后右子树。

后序:先左子树,再右子树,最后根节点。

前序遍历:

c 复制代码
void PrevOrder(TreeNode* root)
{
	if (root == NULL)
	{
		printf("N ");
		return;
	}

	printf("%d ", root->data);
	PrevOrder(root->left);
	PrevOrder(root->right);
}

如果我们的根节点为空就返回空,不为空就递归左子树,如果左子树为空就返回递归访问右子树。

中序遍历:

c 复制代码
void InOrder(TreeNode* root)
{
	if (root == NULL)
	{
		printf("N");
		return;
	}

	InOrder(root->left);
	printf("%d ", root->data);
	InOrder(root->right);
}

先访问遍历左子树,再根节点,最后在访问右子树。

后序遍历:

c 复制代码
void Tailorder(TreeNode* root)
{
	if (root == NULL)
	{
		printf("N");
		return;
	}
	Tailorder(root->left);
	Tailorder(root->right);
	printf("%d", root->data);
}

先遍历左子树,再遍历右子树,最后在根节点。

求二叉树节点个数:

c 复制代码
int TreeSize(TreeNode* root)
{
	return root == NULL ? 0 :
		TreeSize(root->left) +
		TreeSize(root->right) + 1;
}

我们递归实现,左子树的节点个数加上右子树的节点个数再加上根节点的个数就是节点的总个数。

求叶子结点的个数:

c 复制代码
int TreeLeafSize(TreeNode* root)
{
	// 空 返回0
	if (root == NULL)
		return 0;
	// 不是空,是叶子 返回1
	if (root->left == NULL
		&& root->right == NULL)
		return 1;

	// 不是空 也不是叶子  分治=左右子树叶子之和
	return TreeLeafSize(root->left) +
		TreeLeafSize(root->right);
}

求二叉树的高度:

c 复制代码
int TreeHeight(TreeNode* root)
{
	if (root == NULL)
		return 0;
	int leftHeight = TreeHeight(root->left);
	int rightHeight = TreeHeight(root->right);

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

因为我们的递归结合上三目操作符会使得非常的复杂,所以我们用一个数据来保存左右子树的高度,我们的二叉树的高度为左右子树较高的那个子树加上1,所以我们返回的是左右子树高度更高的再加上1就是二叉树的高度。

我们的代码还可以进行改进,我们C语言的fmax函数:该函数的作用是比较两个数得到较大的那一个数

c 复制代码
int TreeHeight(TreeNode* root)
{
	if (root == NULL)
		return 0;

	return fmax(TreeHeight(root->left), TreeHeight(root->right)) + 1;
}

求二叉树第k层节点个数:

c 复制代码
int TreeLevelK(TreeNode* root, int k)
{
	assert(k > 0);
	if (root == NULL)
		return 0;

	if (k == 1)
		return 1;

	return TreeLevelK(root->left, k - 1)
		+ TreeLevelK(root->right, k - 1);
}

第k层的节点等于第k-1层的节点数相加。

现在我们要求第三层的节点数,相当于我们返回它的第二层,而我们的第二层节点数要返回我们的第一层节点数,我们的左子树返回一个节点,右子树返回两个节点,所以就是三个节点。

如果对大家有所帮助的话就支持一下吧!

相关推荐
papership5 小时前
【入门级-数据结构-3、特殊树:完全二叉树的数组表示法】
数据结构·算法·链表
smj2302_796826525 小时前
解决leetcode第3911题.移除子数组元素后第k小偶数
数据结构·python·算法·leetcode
山甫aa5 小时前
差分数组 ----- 从零开始的数据结构
数据结构
早日退休!!!6 小时前
《数据结构选型指南》笔记
数据结构·数据库·oracle
九转成圣6 小时前
Java 性能优化实战:如何将海量扁平数据高效转化为类目字典树?
java·开发语言·json
SmartRadio6 小时前
ESP32-S3 双模式切换实现:兼顾手机_路由器连接与WiFi长距离通信
开发语言·网络·智能手机·esp32·长距离wifi
丑八怪大丑6 小时前
Java数据结构与集合源码
数据结构
laowangpython6 小时前
Rust 入门:GitHub 热门内存安全编程语言
开发语言·其他·rust·github
我叫汪枫6 小时前
在后台管理系统中,如何递归和选择保留的思路来过滤菜单
开发语言·javascript·node.js·ecmascript
_.Switch6 小时前
东方财富股票数据JS逆向:secids字段和AES加密实战
开发语言·前端·javascript·网络·爬虫·python·ecmascript