1.首先了解什么是搜索二叉树
二叉树需要同时满足以下条件
(1)左子树上所有节点的值都小于根节点的值
(2)右子树上所有节点的值都大于根节点的值
(3)左右子树都是二叉搜索树。
2.这里我们采用递归套路来解决递归套路
(1)分析问题的各种可能性
(2)根据可能性去确定要去收集左右子树的哪些信息,写出信息体
(3)根据收集来左右子树的信息得到自己的这些信息
(4)返回信息体类型对象
3.解题步骤
(1)基于搜索二叉树的特点,我们知道如果一个二叉树是搜索二叉树,那么它的左子树和右子树必须同时为搜索二叉树,并且左子树结点的最大值必须小于头结点值,右子树结点的最小值大于头结点值
(2)通过分析,考虑到递归对二叉树以及其左右子树一视同仁,因此信息体内的信息为:是否为搜索二叉树,二叉树所有结点的最大值,二叉树所有结点的最小值
class Info{
boolean isBST;
int max;
int min;
}
(其中isBST为是否是搜索二叉树,max为结点最大值,min为结点最小值)
(3)收集左右子树的信息体信息,返回值类型为信息体类型Info,需要考虑树为空的情况,此时我们不好确定是否为搜索二叉树,且最大最小值,那我们就返回空值return null;(在上游处理空置)
收集完左右信息返回Info leftInfo, Info rightInfo
根据收集到的左右子树信息,写出自己的信息
最大最小值容易判断
int max = x.value;
if (leftInfo != null) {
max = Math.max(max, leftInfo.max);
}
if (rightInfo != null) {
max = Math.max(max, rightInfo.max);
}
int min = x.value;
if (leftInfo != null) {
min = Math.min(min, leftInfo.min);
}
if (rightInfo != null) {
min = Math.min(min, rightInfo.min);
}
如何判断是不是搜索二叉树呢(还要考虑空值)
首先我们假设是搜索二叉树,即boolean isBST=true;(和叶子结点有关,叶子结点需要设置为是搜索二叉树true,否则后续不好调整为true)
if (leftInfo != null && !leftInfo.isBST) {
isBST = false;
}
if (rightInfo != null && !rightInfo.isBST) {
isBST = false;
}
if (leftInfo != null && leftInfo.max >= x.value) {
isBST = false;
}
if (rightInfo != null && rightInfo.min <= x.value) {
isBST = false;
}
(4)返回信息体类型对象
return new Info(isBST, max, min);
还可以采用二叉树中序遍历的方法,后续有时间更