【力扣面试】面试题 04.05. 合法二叉搜索树
题目
实现一个函数,检查一棵二叉树是否为二叉搜索树。
示例 1:
示例 2:
解题思路
二叉搜索树的定义
二叉搜索树(BST)又称二叉查找树或二叉排序树
二叉搜索树,也称有序二叉树,排序二叉树,是指一棵空树或者具有下列性质的二叉树:
二叉搜索树或者是一棵空树,或者是具有下列性质的二叉树:
(1)若左子树不空,则左子树上所有结点的值均小于或等于它的根节点的值;
(2)若右子树不空,则右子树上所有结点的值均大于或等于它的根结点的值;
(3)左、右子树也分别为二叉搜索树;
二叉搜索树的性质表明:它的中序遍历一定是升序的!方法一
利用递归的中序遍历方法,先把遍历的结果存储起来,然后比较其是否是升序的。
代码
class Solution0405 {
boolean flag = true;
public boolean isValidBST(TreeNode root) {
List<Integer> res = new ArrayList<>();
inorder(root, res);
int num = res.size();
for (int i = 0; i < num - 1; i++) {
if (res.get(i) >= res.get(i + 1)) {
flag = false;
break;
}
}
return flag;
}
public void inorder(TreeNode root, List<Integer> res) {
if (root == null) {
return;
}
inorder(root.left, res);
res.add(root.val);
inorder(root.right, res);
}
}
方法二
利用迭代的二叉树中序遍历方法,如果上一个节点的值,比下一个大于等于,则为false
代码
class Solution04052 {
public boolean isValidBST(TreeNode root) {
Stack<TreeNode> stack = new Stack<>();
double inorder = -Double.MAX_VALUE;
while (!stack.isEmpty() || root != null) {
while (root != null) {
stack.push(root);
root = root.left;
}
root = stack.pop();
// 如果中序遍历得到的节点的值小于等于前一个 inorder,说明不是二叉搜索树
if (root.val <= inorder) {
return false;
}
inorder = root.val;
root = root.right;
}
return true;
}
}