求整棵树的最大搜索二叉子树(高度套路)

进阶5开始:
最大搜索二叉子树 指该二叉树的子树中,是搜索二叉树 且结点个数最多的。

搜索二叉树: 左子树的值小于头结点的值,右子树的值大于头结点。

这类题一般都有一个大前提:假设对于以树中的任意结点为头结点的子树,我们都能求得其最大搜索二叉子树的结点个数,那么答案一定就在其中。

而对于以任意结点为头结点的子树,其最大搜索二叉子树的求解分为三种情况(列出可能性):

  • 整棵树的最大搜索二叉子树存在于左子树中。这要求其左子树中存在最大搜索二叉子树,而其右子树不存在。
  • 整棵树的最大搜索二叉子树存在于右子树中。这要求其右子树中存在最大搜索二叉子树,而其左子树不存在。
  • 最整棵二叉树的最大搜索二叉子树就是其本身。这需要其左子树就是一棵搜索二叉子树且左子树的最大值结点比头结点小、其右子树就是一棵搜索二叉子树且右子树的最小值结点比头结点大。
    第一种情况例子:
    在这里插入图片描述
    第三种情况例子:
    在这里插入图片描述
    要想区分这三种情况,我们需要收集的信息:
  • 左子树中 最大搜索二叉树大小
  • 右子树中 最大搜索二叉树大小
  • 左子树的 最大搜索二叉树 的头结点(若是该头结点就是 左孩子,则整棵左树均是最大搜索二叉树 )
  • 右子树的 最大搜索二叉树 的头结点(若是该头结点就是 右孩子,则整棵右树均是最大搜索二叉树 )
  • 左子树的最大值
  • 右子树的最小值

这棵树的最大搜索二叉子树,可以说4、3,5 4 3
但是不能说5 4
在这里插入图片描述

因为子树指的是,从头结点开始,剩下全部都得包括
5 4 算是一种 拓扑结构,只要连成一片的都是拓扑结构。在这里插入图片描述
例子:
在这里插入图片描述
分别为左子树中最大搜索二叉树、右子树中最大搜索二叉树
但是左子树中的最大值11大于6,右子树的最小值2小于6,所以整体不是搜索二叉树(应满足左小右大)
在这里插入图片描述
因此我们就可以开始我们的高度套路了:

  1. 将要从子树收集的信息封装成一个 ReturnData ,代表处理完这一棵子树要向上级返回的信息。
    ReturnData包括:
    在这里插入图片描述
    对应代码:
    在这里插入图片描述

  2. 假设我利用子过程收集到了子树的信息,接下来根据子树的信息和分析问题时列出的情况加工出当前这棵树
    要为上级提供的所有信息,并返回给上级(整合信息)。

  3. 确定 base case ,子过程到子树为空时,停。

定义了递归函数:
在这里插入图片描述
把左树扔到递归函数中,
左树的四个信息 leftSubTreeInfo都在returntype这个变量中,
在这里插入图片描述
然后把右树放入这样一个递归函数:
在这里插入图片描述
下面这一段是可能性3(整棵二叉树的最大搜索二叉子树就是其本身)的代码:
如果左子树头结点是 左孩子。
且 右子树头结点是 右孩子。
且 当前值比我 左树上的最大值要大。
且 当前值比我 右树上的最小值要小。
在这里插入图片描述
则可以连成一片:
在这里插入图片描述
如果可能性3不满足,则includeItself 初始化为0

下面这一段代码为可能性1和可能性2
在这里插入图片描述

左树上 经过函数P,得到两个信息,左树上最小和左树上最大
右树上 经过函数P,得到两个信息,右树上最小和右树上最大
整棵树最小值 是 左树的最小和 右树的最小 和头结点的最小
整棵树最大值 是 左树的最大和 右树的最大 和头结点的最大
在这里插入图片描述
特别注意,这一部分改掉了!
因为return data是先max后min,所以也要改成对应的!
在这里插入图片描述
如果有子树 为空,
则为了不让空树 干扰决策
则空树 最小值 返回系统最大
空树 最大值 返回系统最小
这样,必然不会干扰上一层x做决策
在这里插入图片描述
所以代码为:
首先是最小值,然后是最大值。
在这里插入图片描述
为什么这样不会 干扰 上一层做决策呢?
空树的最小很大,所以不会影响这一句。
在这里插入图片描述
例子:
在这里插入图片描述
对于头结点是1的子树,系统最大和系统最小,都是自身。

对于头结点是6的子树,右子树是空,所以右子树返回 min是6,max是1
左子树返回min是1 , max是1

所以6返回给5的 min是1 , max是6。

同理,9给7的信息:min是9 , max是9。
null给7的信息:min是9, max是7。
所以7返回给5的 min是7 , max是9。

所以5在如下两项
min是7 , max是9。
min是1 , max是6。
做决策的话,
min是1 , max是9。

这是一个大套路,可以解决很多问题,而且代码高度一致

进阶5 49.14

50.21

当左树的最大搜索二叉子树 不是我左孩子的时候,即if条件不满足,说明连不起来。
在这里插入图片描述
例子:
0为开头的整棵树,返回的头部是5,所以连不起来,
在这里插入图片描述
第二个条件,也是
当右树的最大搜索二叉子树 不是我右孩子的时候,说明连不起来。
第三个条件,在前俩个条件成立的情况下,当前的值比我左树的最大值要大。

这个size是左树上最大二叉搜索子树的大小,当条件1满足时,是左子树的大小
所以可能性三:左子树的大小+头结点+右子树大小
在这里插入图片描述
以上讲解完,三种可能性代码:
在这里插入图片描述
然后,在p1,p2,和includeItself(第三种可能)中 选出一个最大的!
53.10
这一段代码在指:
当前选择的最大搜索二叉子树的情况是来自哪一种。
在这里插入图片描述
这就是拆黑盒的过程。
在这里插入图片描述
总结:
三步走:
列可能性;
整合信息;
改递归(略复杂,先假设左右 都给我这样的信息,怎么利用左右的信息组合出我该返回的信息,最后basecase填什么搞定)。

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值