找到二叉树中的最大搜索二叉子树
- 递归
- 技巧的写法
- 完整测试代码
题目
递归
解析:
这种题目的解题过程分为三步:
- 列出所有可能性;
- **列出结点需要的信息,并整合信息(成一个结构体)**;
- 改递归 ,先假设左和右都给我信息(黑盒),然后怎么利用左边和右边的信息组出来我该返回的信息,最后
basecase
(边界)填什么;
具体到这个题目:
第一步,列出所有可能性:
- 第一种可能性,以
node
为头的结点的最大二叉搜索子树可能来自它左子树; - 第二种可能性,以
node
为头的结点的最大二叉搜索子树可能来自它右子树; - 第三种可能性,左树整体是搜索二叉树,右树整体也是搜索二叉树,而且左树的头是
node.left
,右树的头是node.right
,且左树的最大值< node.value
,右树的最小值> node.value
, 那么以我为头的整棵树都是搜索二叉树;
第二步,列出结点需要的信息:
- 信息一: 左树最大搜索二叉树大小;
- 信息二: 右树最大搜索二叉树大小;
- 信息三: 左树上最大搜索二叉树的头部是什么;
- 信息四: 右树上最大搜索二叉树的头部是什么;
- 信息五: 左树上的最大值;
- 信息六: 右树上的最小值;
整合成一个Pair
结构: 信息一和信息二整合:size
,信息三和信息四整合 : head
(结点类型),以及信息五和信息六 ;
1 | //返回的类型 |
然后第三部就是改成递归,具体如下(是后序遍历的顺序(需要左右的信息来构造头部的信息)):
1 | static class Node { |
改造的写法
技巧的写法(使用一个数组来记录size,min,max
):
1 | static Node biggestSubBST2(Node head) { |
完整测试代码(测试样例)
1 | /** |
二叉树打印见这个博客
测试效果: