方法1:中序遍历递归
对给定的二叉树进行中序遍历,若始终能保持前一个值比后一个值小,则说明二叉树是一颗二叉搜索树。
代码:
/**
* Definition for a binary tree node.
* public class TreeNode {
* int val;
* TreeNode left;
* TreeNode right;
* TreeNode() {}
* TreeNode(int val) { this.val = val; }
* TreeNode(int val, TreeNode left, TreeNode right) {
* this.val = val;
* this.left = left;
* this.right = right;
* }
* }
*/
class Solution {
long predt = Long.MIN_VALUE;
//predt保存当前结点中序前驱的值,初始值要比int的最小值小,这里设为Long.MIN_VALUE
public boolean isValidBST(TreeNode root) {
boolean b1, b2;
if (root == null ) {
return true;
}
else {
b1 = isValidBST(root.left);
if ((!b1)||(predt >= root.val)) {
return false;
}
predt = root.val;
b2 = isValidBST(root.right);
return b2;
}
}
}
方法2:递归
public boolean isValidBST(TreeNode root) {
return isValidBST(root, Long.MIN_VALUE, Long.MAX_VALUE);
}
public boolean isValidBST(TreeNode root, long minVal, long maxVal) {
if (root == null)
return true;
//每个节点如果超过这个范围,直接返回false
if (root.val >= maxVal || root.val <= minVal)
return false;
//这里再分别以左右两个子节点分别判断,
//左子树范围的最小值是minVal,最大值是当前节点的值,也就是root的值,因为左子树的值要比当前节点小
//右子数范围的最大值是maxVal,最小值是当前节点的值,也就是root的值,因为右子树的值要比当前节点大
return isValidBST(root.left, minVal, root.val) && isValidBST(root.right, root.val, maxVal);
}
作者:数据结构和算法
链接:https://leetcode-cn.com/leetbook/read/top-interview-questions-easy/xn08xg/?discussion=69ga70
来源:力扣(LeetCode)
著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。
方法3:中序遍历非递归
public boolean isValidBST(TreeNode root) {
if (root == null)
return true;
Stack<TreeNode> stack = new Stack<>();
TreeNode pre = null;
while (root != null || !stack.isEmpty()) {
while (root != null) {
stack.push(root);
root = root.left;
}
root = stack.pop();
if (pre != null && root.val <= pre.val)
return false;
//保存前一个访问的结点
pre = root;
root = root.right;
}
return true;
}
作者:数据结构和算法
链接:https://leetcode-cn.com/leetbook/read/top-interview-questions-easy/xn08xg/?discussion=69ga70
来源:力扣(LeetCode)
著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。