什么是搜索二叉树
用来搜索的二叉树就叫搜索二叉树,用来对数据进行二分查找,特点就是
1 所有左叶子节点的数都比当前节点小
2 所有右边节点的数都比当前节点大
思路:判断当前节点的左右子树是不是二叉树,如果是,说明当前节点有可能是,判断当前节点是不是二叉树
可能情况:
1 当前节点也是二叉查找树,条件就是左右子树是二叉查找树,并且当前节点的值大与左子树最大值,小于右子树最小值
2 当前节点不是二叉查找树,条件 左右子树有一个不是二叉查找树树的当前节点就不是,并且当前节点的值大与左子树最大值,小于右子树最小值 这个条件不成立
Node节点内容:
1 当前节点之下是否是二叉查找树树 boolen
2 当前节点下所有节点最大值
3 当前节点下所有节点最小值
代码
package 算法.二叉树;
import 算法.二叉树遍历;
//判断二叉树是否是搜索二叉树
public class test1 {
/**
* 树节点
*/
public static class Node {
//1 当前节点之下是否是二叉查找树树 boolen
public boolean flag;
//2 当前节点下所有节点最大值
public int max;
//3 当前节点下所有节点最小值
public int min;
public int num;
public Node left;
public Node right;
public Node(boolean flag, int max, int min) {
this.flag = flag;
this.max = max;
this.min = min;
}
}
public static Node process(Node node) {
//当前节点为空返回
if (node == null) {
return new Node(true,0,0);
}
Node l = process(node.left);
Node r = process(node.right);
//拿到左右节点之后 判断相应情况
//1 如果满足二叉查找树 条件就是左右子树是二叉查找树,并且当前节点的值大与左子树最大值,小于右子树最小值
node.flag = false;
if (l.flag && r.flag && node.num > l.max&& node.num< r.min) {
node.flag = true;
}
// 2 更改max 和min的数据
node.max = Math.max(l.max, r.max);
node.min = Math.max(l.min, r.min);
return node;
}
public static void main(String[] args) {
process(null);
}
}