描述
给定一个二叉树根节点,请你判断这棵树是不是二叉搜索树。
二叉搜索树满足每个节点的左子树上的所有节点均小于当前节点且右子树上的所有节点均大于当前节点。
例:
我的解法:
定义一个全局节点保存当前节点的根节点信息,递归该二叉树,判断当前节点的左节点与右节点是否满足搜索树条件,注意:防止左子树的当前节点的右节点超过根节点,需要额外的进行判断,右子树也同理
其他解法:
中序遍历二叉树,观察结果是否有序来判断是否为二叉搜索树(略)
/*
* public class TreeNode {
* int val = 0;
* TreeNode left = null;
* TreeNode right = null;
* public TreeNode(int val) {
* this.val = val;
* }
* }
*/
public class Solution {
/**
* 代码中的类名、方法名、参数名已经指定,请勿修改,直接返回方法规定的值即可
*
*
* @param root TreeNode类
* @return bool布尔型
*/
boolean b = true;
TreeNode t;
public boolean isValidBST (TreeNode root) {
// write code here
//或者采用中序遍历搜索树一定有序来判断
t = root;
a(root);
return b;
}
public void a(TreeNode root) {
if (root == null||b==false)
return;
//判断当前节点的左子树
if (root.left != null) {
if (root.left.val > root.val) {
b = false;
return;
}
if (t.val < root.val) {//说明当前节点是根节点的右子树
if (root.left.val < t.val) {//保证根节点的左节点的右节点要大于根节点
b = false;
return;
}
}
}
//判断当前节点的右子树
if (root.right != null) {
if (root.right.val < root.val) {
b = false;
return;
}
if (t.val > root.val) {//说明当前节点是根节点的左子树
if (root.right.val > t.val) {//保证根节点的右节点的左节点要大于根节点
b = false;
return;
}
}
}
t = root;
a(root.left);
a(root.right);
}
}