手撕链式二叉树(二)—【C语言】

这篇具有很好参考价值的文章主要介绍了手撕链式二叉树(二)—【C语言】。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

手撕链式二叉树(二)—【C语言】

链式二叉树(一)         http://t.csdn.cn/HWu6E

目录

1. 二叉树找值为x的节点

代码实现分析

 代码实现

递归展开图

2. 求二叉树层数

代码思路分析

代码实现 

 3. 二叉树的销毁

代码思路分析

代码实现

运行结果

4. 二叉树的一些OJ题目

1. 单值二叉树                      OJ链接跳转 

2. 检查两颗树是否相同       OJ链接跳转

3. 对称二叉树                      OJ链接跳转

4. 二叉树的前序遍历           OJ链接跳转

5. 二叉树中序遍历              OJ链接跳转

6. 二叉树的后序遍历           OJ链接跳转

7. 另一颗树的子树              OJ链接跳转


1. 二叉树找值为x的节点

代码实现分析

代码步骤分析:

1. 判断根节点是不是空,是空就返回NULL

2. 不是NULL,就判断该节点的数据是不是要找的数据,是 —>(找到了,一层一层返回上去)

3. 不是要找的数据,就开始调用左子树(如果左子树一直没找到),从最后递归到的NULL开始返回,返回到调用的地方,然后开始调用最后一层的右子树,如果左子树和右子树都递归完了,还没找到就返回NULL

4. 如果一颗二叉树左子树和右子树都有要找的值,只要先找到其中一个,该值就会被一层一层的返回上去,剩下相同的值就不会找找了

 代码实现

// 二叉树查找值为x的结点
BTNode* TreeFind(BTNode* root, BTDataType x)
{
	if (root == NULL)
		return NULL;

	if (root->data == x)
		return root;

	BTNode* ret1 = TreeFind(root->left, x);
	if (ret1)
		return ret1;

	BTNode* ret2 = TreeFind(root->right, x);
	if (ret2)
		return ret2;

	return NULL;
}

递归展开图

举例:假设我们这里找5这个节点

注意:我这里把5的位置换了下,让他在左子树就可以被找到(还是画出的左子树的递归图


过程讲解:1. 一直递归调用左边,递归到3的左儿子是NULL,返回到调用NULL的地方,开                          始调用3的右儿子,发现也是NULL

                  2. 这时返回到调用3的地方,3是被2的左边调用的,返回后,开始递归2的右儿子

                  3. 这时要找的数据x和data相同,if条件符合,执行return,然后就开始返回上去

                  4. 首先返回到2调用右儿子的地方,if语句为真,继续返回,返回到2被1调用的地                        方

                  5. 还是if条件为真,返回出去了,这时整个递归就结束了

手撕链式二叉树(二)—【C语言】



2. 求二叉树层数


手撕链式二叉树(二)—【C语言】


代码思路分析

代码实现分析:

1. 先判断根节点是不是为空,为空就返回NULL,就结束了

2. 走到这里那根节点就不是空,不是空就开始一直递归树的左边,递归到3的左儿子,左儿子是空,这时if条件判断成立,就返回0,开始递归3的右儿子,右儿子也为NULL,这时左返回的层数和右返回的层数比较,由于左边和右边一样都为0,那就随便返回一个+1

3. 节点3的左右儿子都返回完了,这时开始递归调用2的右子树,右子树为空,和3返回的作比较,3返回的值大,那就返回层数2

4. 后面和3的逻辑差不多,最后就是比较节点2返回的层数和4返回的层数谁大,然会就返回给1,节点1再+1,然会就返回出去,结束整个递归


通过上面的分析可以看出,这个是二叉树遍历顺序中的后序遍历

代码实现 

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

}


 3. 二叉树的销毁


手撕链式二叉树(二)—【C语言】

代码思路分析

前中后序遍历,哪个更适合这里的二叉树销毁呢?


如果采用前序遍历去销毁,一进来就销毁根节点,节点中存着的左孩子和右孩子的指针,如果我们一进来就销毁根节点,这时的左右孩子指针就也被销毁了,不能遍历下去了

中序遍历也一样


后序遍历访问根的顺序——左子树—>右子树—>根,所以我们使用后序遍历可以轻松的避免上面的问题发生

代码实现

通过上面可以知道是后续遍历,代码步骤分析如下

1. 还是一开始就递归调用左边,递归到NULL就返回,开始递归调用右边,右边到NULL,然      后就释放节点,这时就回到2,先不销毁2,先递归2的右边,是NULL,然后就销毁节点2

2. 节点2销毁后,就返回1的右边,开始递归调用1的右孩子》》》(原理和左边相同)

void TreeDestroy(BTNode* root)
{
	if (root == NULL)
	{
		return;
	}
	TreeDestroy(root->left);
	TreeDestroy(root->right);
	free(root);
}

运行结果

注意点:一般递归不好调试,我们可以借助打印,来理解

由于我们使用的是后序遍历,所以我们这里打印的销毁节点的顺序,就是后序遍历的顺序

手撕链式二叉树(二)—【C语言】



4. 二叉树的一些OJ题目

下面是一些Leetcode上的一些二叉树练习题,价值还是蛮高的,可以点击OJ链接跳转去做题

后面小余也会出这些题目的题解和做题心得,大家可以关注下哦!

1. 单值二叉树                      OJ链接跳转 

2. 检查两颗树是否相同       OJ链接跳转

3. 对称二叉树                      OJ链接跳转

4. 二叉树的前序遍历           OJ链接跳转

5. 二叉树中序遍历              OJ链接跳转

6. 二叉树的后序遍历           OJ链接跳转

7. 另一颗树的子树              OJ链接跳转



如果觉得文章不错,期待你的一键三连哦,你个鼓励是我创作的动力之源,让我们一起加油,顶峰相见!!!文章来源地址https://www.toymoban.com/news/detail-463402.html

到了这里,关于手撕链式二叉树(二)—【C语言】的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • 二叉树的链式结构 - C语言(含有大量递归)

    目录: 🍔前言 🍔二叉树链式结构的实现 🍟基本构架 😍代码: 🍔二叉树的遍历 🍟前序遍历 🍟中序遍历 🍟后序遍历 🍟层序遍历 🔴层序遍历的思路及代码 🍔 构建二叉树  😍代码: 🍔二叉树销毁 😍代码:   🍔二叉树节点个数 😍代码: 🍔二叉树叶子节点个数

    2024年02月08日
    浏览(37)
  • 二叉树的链式结构 - 遍历 - C语言递归实现

    前序、中序以及后序遍历         二叉树遍历 (Traversal) 是按照某种特定的规则,依次对二叉 树中的节点进行相应的操作,并且每个节点只操作一次 。 按照规则,二叉树的遍历有: 前序/中序/后序 的递归结构遍历 : 1. 前序遍历 (Preorder Traversal 亦称先序遍历 )—— 访问根结

    2024年02月15日
    浏览(33)
  • 【C语言】数据结构——链式二叉树实例探究

    💗个人主页💗 ⭐个人专栏——数据结构学习⭐ 💫点击关注🤩一起学习C语言💯💫 我们在前面学习了单链表,顺序表,栈和队列,小堆。 今天我们来学习链式二叉树 关注博主或是订阅专栏,掌握第一消息。 链式二叉树(Linked Binary Tree)是一种基于链表实现的二叉树结构。

    2024年02月04日
    浏览(40)
  • 【数据结构初阶】八、非线性表里的二叉树(二叉树的实现 -- C语言链式结构)

    ========================================================================= 相关代码gitee自取 : C语言学习日记: 加油努力 (gitee.com)  ========================================================================= 接上期 : 【数据结构初阶】七、非线性表里的二叉树(堆的实现 -- C语言顺序结构)-CSDN博客  ==========

    2024年02月08日
    浏览(52)
  • 数据结构入门(C语言版)二叉树链式结构的实现

    简单回顾一下二叉树的 概念: ★ 空树 ★非空:根节点,根节点的左子树、根节点的右子树组成的。 从概念中可以看出,二叉树定义是递归式的,因此后序基本操作中基本都是按照该概念实现的。 下面我们先看二叉树的结构体定义以及创建 首先结构体的定义是元素本身,以

    2023年04月23日
    浏览(47)
  • 【链式二叉树】数据结构链式二叉树的(万字详解)

    前言: 在上一篇博客中,我们已经详解学习了堆的基本知识,今天带大家进入的是二叉树的另外一种存储方式----“链式二叉树”的学习,主要用到的就是“递归思想”!! 前情回顾: 再看二叉树基本操作前,再回顾下二叉树的概念,二叉树是: 空树 非空:根节点,根节点

    2024年01月20日
    浏览(51)
  • 二叉树的链式存储

    2024年02月14日
    浏览(41)
  • 【数据结构】二叉树(链式)

    😛作者:日出等日落 📘 专栏:数据结构           抱怨是一件最没意义的事情。如果实在难以忍受周围的环境,那就暗自努力练好本领,然后跳出那个圈子。 目录  🎄二叉树 ✔二叉树的结构:  ✔BuyNode(创建二叉树节点): 🎄基本函数操作: ✔PreOrder(前序递归遍历):

    2024年02月01日
    浏览(46)
  • 【数据结构】二叉树——链式结构

    目录  一、前置声明 二、二叉树的遍历 2.1 前序、中序以及后序遍历 2.2 层序遍历 三、节点个数以及高度 3.1 节点个数 3.2 叶子节点个数 3.3 第k层节点个数 3.4 二叉树的高度/深度 3.5 查找值为x的节点 四、二叉树的创建和销毁 4.1 构建二叉树 4.2 二叉树销毁 4.3 判断二叉树

    2024年02月16日
    浏览(47)
  • 【数据结构和算法】--- 二叉树(3)--二叉树链式结构的实现(1)

    在学习二叉树的基本操作前,需先要创建一棵二叉树,然后才能学习其相关的基本操作。由于现在大家对二叉树结构掌握还不够深入,且为了方便后面的介绍,此处手动快速创建一棵简单的二叉树,快速进入二叉树操作学习,等二叉树结构了解的差不多时,我们反过头再来研

    2024年01月25日
    浏览(63)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包