判定是否是搜索树
判定是否是搜索树
题目:
给定一颗二叉树,判定该二叉树是否是一颗搜索树。
注: 所谓的搜索树就是一棵二叉树的任意子树的左节点的值都要小于根节点的值以及右节点的值都要大于根节点的值。
解题思路:
我们首先定义一个信息类Info这个信息类包括的信息有是否是一颗搜索树以及左子树的最大值以及右子树的最小值,我们递归地处理左子树以及右子树最后根据左右子树地Info信息综合来判断这棵树是否是一颗搜索树。具体代码如下:
代码:
/**
* 判断一棵树是否是搜索树
* 搜索树:对于任意一棵二叉树的左节点小于根节点 右节点大于根节点
*/
public class IsBinarySearchTree {
//1.首先定义一个表示二叉树节点类型的类
public static class TreeNode {
public int val;
public TreeNode left;
public TreeNode right;
TreeNode(int val) {
this.val = val;
}
}
//2.定义一个Info类这个类包含信息有 是否是搜索树 左子树的最大值 以及右子树的最小值
public static class Info {
public boolean isBST;
public int max;
public int min;
public Info(boolean is, int ma, int mi) {
isBST = is;
max = ma;
min = mi;
}
}
//3.定义一个方法用来处理是否是搜索树
public static Info process(TreeNode x) {
//3.1如果根节点为空那么此树不是一颗搜索树
if (x == null) {
return null;
}
//3.2使用process函数递归处理左子树以及右子树
Info leftInfo = process(x.left);
Info rightInfo = process(x.right);
//3.3先定义左子树的最大值以及右子树的最大值为x的val
int max = x.val;
int min = x.val;
//3.4如果左子树的信息不为空那么获取左子树的最大值
if (leftInfo != null) {
max = Math.max(leftInfo.max, max);
min = Math.min(leftInfo.min, min);
}
//3.5如果右子树的信息不为空那么获取右子树的最小值
if (rightInfo != null) {
max = Math.max(rightInfo.max, max);
min = Math.min(rightInfo.min, min);
}
//3.6先定义一个变量是否为搜索树 isBST 设为false
boolean isBST = false;
//3.7分别判定左右子树是否为搜索树 如果左右子树为空树那么左右子树默认为搜索树
boolean leftIsBst = leftInfo == null ? true : leftInfo.isBST;
boolean rightIsBst = rightInfo == null ? true : rightInfo.isBST;
//3.8分别判定左子树的最大值是否小于x的值 右子树的最小值是否大于x的值
boolean leftMaxLessX = leftInfo == null ? true : (leftInfo.max < x.val);
boolean rightMinMoreX = rightInfo == null ? true : (rightInfo.min > x.val);
//3.9根据以上得到的信息综合判断整棵树是否是一颗搜索树
if (leftIsBst && rightIsBst && leftMaxLessX && rightMinMoreX) {
isBST = true;
}
//3.10最后返回最终的Info信息
return new Info(isBST, max, min);
}
}
浙公网安备 33010602011771号