对于数据结构中树相关问题的算法处理方式

如何判断一棵树是搜索二叉树?

中序遍历下来,看是不是不降序即可,因为搜索二叉树的性质就是左边小,右边大
也可以不全都拿出来, 因为中序递归遍历的时候check的时机是一样的,那么我们改成check左右子树,留一个全局变量,时刻记录前一个比较的数据,确保比后面的小。这样的优势在于动态检查,一个递归全干完了

如何判断一个树是完全二叉树

层序遍历check,如果遇到一种只有右孩子没有左孩子的直接FALSE
在满足前置条件前提下,如果遇到左右孩子不双全的情况了。那么只有遇到的所有节点都必须是叶子结点,是就是完全二叉树,反之不是。

如何判断一个树是满二叉树

就是获得节点的个数和书的最大深度,二者之间满足2^n-1=节点个数的话,就一定是满二叉树,反之不是。

如何判断一个树是平衡二叉树

这里我们可以引入二叉树的递归套路,就是我需要的所有信息都是从左右子树获得之后我再进行判断。
比如判断平衡二叉树的条件:
1.左子树平衡
2.右子树平衡
3.两个子树之间高度差<=1
基于这一点,可以设置returntpye结构体,包含是否平衡和高度,空子树的时候返回TRUE,0,树的高度为最深子树高度+1。

好了,我们得到了最通用的递归二叉树的套路,我们会看一下之前的问题:搜索树判断:
判定条件:
1.左子树是搜索树
2.右子树也是搜索树
3.左子树最大<x
4.右子树最小>x
怎么办?
Returntype都要包含,最大,最小,是否是搜索二叉树,三个元素,需要注意就是子树为空返回null

判断满二叉树可以吗?

也可以,我们只要设置高度和树的节点个数作为return开始遍历。

这种二叉树递归就是最强的递归手段,程序结构和获取信息的方式都是非常制式和规范的。
基本树形bp这种方法伯分之伯能解。但是不是所有二叉树问题,因为如果你不能只从自己左右子树获得信息解决问题,那基本就用不了了(反之用不了的问题基本都是个笨比解法)

实际问题之找两个节点的最低的公共祖先

首先,来一个哈希表,用来记录每一个节点的父亲节点,然后遍历填表就可以了。每遍历一个点,就是左孩子和本节点,右孩子和本节点两个数据对进入哈希表
记得根节点这样是get不了的,所以是得要手动放进去。
然后其中一个节点往上走走到头,把整个的路径节点都存在一个set数据结构里面,然后第二个往上走,一路走一路check,找到了就找到了,记得得是第一个。

这种方法,很好,但是实现起来用到的数据结构有些多并且代码不短,可以优化吗?

可以。那就得整点花活了
使用递归程序,从上往下遍历,初始条件就是null,两个节点返回自己,因为这种问题一共两个情况,一个是公共祖先是两个中的一个,另一种就一定是在子树的左右两边,就往上找,其中左右都不为空的话,那就是说明这个节点左右各有一个要求的节点,这就是最终的答案。
可以说是非常优雅的一段代码了。

找后继节点

后继节点:就是中序遍历中节点的下一个节点,最后一个是null
前趋节点:刚好相反,是前一个节点,边界是null

如果中序遍历的话,可以很快找到后继节点,不过时间复杂度是O(n),而实际上最最好的时候可以到O(k),就是两个节点的距离。
那么怎么优化呢?
两个情况:
节点x有右子树的时候,找最最左的。
如果没有右子树,往上走,找到目前节点作为左子树的父亲节点。

二叉树的序列化和反序列化

树——>字符串(序列化,前中后遍历均可以)
就是遍历改一下
字符串——>树(反序列化)
就是不断的消费一个队列
都是递归

来一个趣味题目,折纸n次之后,我们输出从上到下凹凸折痕的顺序

其实就是一个二叉树嘛
左凹右突
n次就是n层
最后要中序遍历的结果

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值