数据结构——链式二叉树(续)

作者:几冬雪来  

时间:2023年4月2日

内容:数据结构链式二叉树内容补充

目录

前言: 

1. 二叉树查找值为x的结点:

2.层序遍历:

3.判断一棵树是否为完全二叉树:

4.销毁二叉树: 

结尾:  


前言: 

在上一篇博客中我们讲解了链式二叉树的部分内容及其代码的书写等等操作,那么今天我们将对这个板块的内容进行知识的补充。 

1. 二叉树查找值为x的结点:

这里首先第一个要补充的内容就是我们二叉树查找值为x的结点,这里的查找方式类似我们的前序遍历的方法——先查找结点,然后左子树再右子树,或者右子树后再左子树

这里先给出我书写的代码:

  

这里如果root为空的话,我们就返回空。要是root->data等于我们要查找的x,这个时候就返回root的地址,如果找不到我们就要进行递归操作,先进行判断如果root的左结点不为空,并且root的data值不为x,我们就要进入递归将root->left传过去作为我们新的root再进行判断。右结点也是使用这种方法,直到找到x并且返回它的地址。

但是我的这种方法有些不足的点,也就是上一篇博客提到的没有保存的问题。这里就需要我们对代码进行修改。 

这里的代码我们就有保存这一步操作了,这里前两步没有什么变化。这里在递归处我们的代码就发生了些许改变,如果递归中找到了我们的x的话就将x的地址交给lret进行保存。为了感觉方便理解,我们就画一个函数递归图来讲解。

假设这里我们要找到值为5的结点,开始就不断的进行向左的递进直到3的左结点为空我们就返回空给lret,接下来代码往下走,因为lret为空所以不进入if语句中的return,下来开始判断右结点,如果右结点还是为空,我们还是返回空给rretif语句依旧不执行,因为结点3是作为结点2的左结点最后我们就需要返回空给我们结点2左子树的if语句判断处再进行右结点的判断,依次执行。这是我们根结点的左子树的查找,同样的我们也可以用这种方法来查找我们根的右子树。

要找的值还是5,这一次我们往右子树的方向走。因为已经判断过根结点的左子树了,所以这里先走右结点来到4的位置不为0后往左走去到4的左结点为5,是我们要找到的值,这里就不用再往下遍历了直接返回它的地址返回后将它给lret接下来因为lret不为空进入if语句这里就再返回lret,因为4是根的右结点,所以代码来到右子树递归的下一行代码进行判断这里lret再一次赋值给了rret因此rret不为空要进行返回给根结点,最后返回根结点的地址,这样就能访问到我们的值了。

2.层序遍历:

在以前我们说过了在二叉树中我们又4种遍历方法,分别是前序遍历,中序遍历,后序遍历和层序遍历,而在前面我们已经对前中后序遍历进行讲解了,今天我们就来讲解二叉树的最后一种遍历方法——层序遍历

而层序遍历我们可以用队列去完成它。 

它的工作原理就是出上一层的数后带入下一层的数。 

这里我们先将队列那里写的代码拿过来使用。因为在进行层序遍历的操作时候,我们要进入1的数据,在出去1的时候我们要带入它的左右结点的值,使用在层序遍历中,我们并不是输入整形进去,而且输入结构体的指针

接下来就是来书写我们的代码。

这里我们再将队列那块知识的代码拿过来。

这里说明起来有一定点复杂且混乱(作者构思了半天不知道怎么说出来,最后只能画图),我们就用一个图来表示一下,层序遍历简单来说就是队列先进先出并且进去的类型不是整形而是结构体的指针,属于结构体嵌套结构体

3.判断一棵树是否为完全二叉树:

接下来我们要判断一棵树是否为完全二叉树。如果要判断一棵树是否为满二叉树的话,我们可以通过数结点个数的方法来判断,但是完全二叉树却显然不能用这个方法,因为完全二叉树的性质是——前k-1层满结点,最后一层至少有一个结点且连续。因此使用这种方法我们无法判断它的结点是否连续。

在这里要判断是否为完全二叉树的话,这里我们就要用到上面的层序遍历。在层序遍历中,我们的非空结点一定是连续的,如果在遇到空结点之后,在这之后还有非空结点,那么这棵树就不是完全二叉树。 

  

这里就是我们的代码,上面一部分还是没有改变。但是在第一个循环中,如果遇到我们的NULL的话,接下来我们就要跳出第一个循环后执行第二个循环因为第一个循环中不为空的值都被我们QueuePop掉了,所以接下来进去的都为空,如果front不为空的话,我们执行if语句

4.销毁二叉树: 

如果要销毁我们的二叉树,层序遍历肯定是用不上的,那么剩下的3种遍历方法我们要用哪一种呢?这里后序遍历是最好的方法这里并不是指前序遍历不行,如果这里要用前序遍历去销毁我们的二叉树的话,我们在对根结点进行释放之前我们必须先保存它的左右子树,相对比较麻烦。而后序遍历就没有这种烦恼。 

这里我们也不含糊,开始就判断我们的root是否为空。如果不为空,这里我们就先删除我们的左结点,再删除我们的右结点(后序遍历先找到左结点再找到右结点,最后找到根结点,删除也是这个顺序),最后将它们的根结点进行释放即可

结尾:  

到了这里,我们数据结构中二叉树的板块基本就已经讲解完毕了,二叉树讲解完了之后我们接下来又要进入数据结构的另一个重要的板块——排序。二叉树的知识板块虽然结束了,但是我们依旧可以通过刷题来提升我们对二叉树的了解,最后希望这篇博客能带来帮助。 

  • 4
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值