初阶数据结构之---二叉树链式结构(二叉树的构建,二叉树的前序,中序,后序和层序遍历,计算二叉树结点个数,第k层结点个数,叶子结点个数,判断是否为完全二叉树)

本文详细介绍了二叉树的链式结构,包括二叉树的定义、构建、遍历(前序、中序、后序和层序)、节点数量计算、二叉树特性(如叶子节点和完全二叉树)以及二叉树的创建与销毁方法。

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

引言

本篇博客是初阶数据结构树的收尾,将会讲掉基本二叉树链式结构的具体内容和实现,包括二叉树的构建,前序遍历,中序遍历,后序遍历和层序遍历,计算二叉树结点个数,第k层结点个数,二叉树叶子结点个数,以及判断一个二叉树是否为完全二叉树。话不多说,开始我们今天的内容。

二叉树链式结构

在之前的博客中,已经讲到了关于链式二叉树相关定义的内容。

这里我们可以来看一看关于二叉树结点的定义:

typedef char BTDataType;//定义存储数据类型

typedef struct BinaryTreeNode
{
	BTDataType _data; //存储数据
	struct BinaryTreeNode* _left; //指向左孩子(左子树)
	struct BinaryTreeNode* _right; //指向右孩子(右子树)
}BTNode;

二叉树:

1. 空树

2. 非空树:由根结点,根节点的左子树,根节点的右子树组成。

从概念上可以看出,二叉树是递归定义的,后面对二叉树的构建和遍历操作都是围绕递归的思路展开。

二叉树的遍历方式及实现

学习二叉树,首先就需要学会其遍历方式,所谓二叉树遍历(Traversal)是按照某种特定的规则,依次对二叉树中的节点进行相应的操作,并且每个节点只操作一次。访问结点所做的操作依赖于具体的应用问题。 遍历是二叉树上最重要的运算之一,也是二叉树上进行其它运算的基础。

按照不同的遍历规则,二叉树的遍历方式有四种:前序遍历,中序遍历,后序遍历和层序遍历

  1. 前序遍历(Preorder Traversal 亦称先序遍历)访问根结点的操作发生在遍历其左右子树之前
  2. 中序遍历(Inorder Traversal)访问根结点的操作发生在遍历其左右子树之中(间)
  3. 后序遍历(Postorder Traversal)访问根结点的操作发生在遍历其左右子树之后

这三种遍历方式大同小异,层序遍历放到后面单独再讲。

下面仔细讲下前序遍历,弄懂前序遍历,中序和后序也就没什么难度了。

1.前序遍历

前序遍历:访问根结点的操作发生在遍历其左右子树之前

前序遍历图解:

对于上面这棵二叉树:

前序遍历结果:1 2 3 N N N 4 5 N N 6 N N

中序遍历结果:N 3 N 2 N 1 N 5 N 4 N 6 N

后序遍历结果:N N 3 N 2 N N 5 N N 6 4 1

层序遍历结果:1 2 4 3 N 5 6 N N N N N N

代码实现:

打印结点操作在遍历左右子树之前。

// 二叉树前序遍历 
void BinaryTreePrevOrder(BTNode* root)
{
	if (root == NULL)return; //遇到NULL结点返回
	printf("%c ", root->_data);
	BinaryTreePrevOrder(root->_left); //递归到左子树
	BinaryTreePrevOrder(root->_right); //递归到右子树
}

评论 47
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

胖达敲代码

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值