原题目
面试题 04.05. 合法二叉搜索树
实现一个函数,检查一棵二叉树是否为二叉搜索树。
示例 1:
输入:
2
/ \
1 3
输出: true
示例 2:
输入:
5
/ \
1 4
/ \
3 6
输出: false
解释: 输入为: [5,1,4,null,null,3,6]。
根节点的值为 5 ,但是其右子节点值为 4 。
第一遍解法
中序遍历二叉搜索树,元素值递增。使用了preVal来保存上一个节点的值,此处假设了节点的最小值不小于Long.MIN_VALUE,虽然节点的val是int是不可能小于的,但是感觉还是不太好,万一val是long且值为Long.MIN_VALUE了该怎么做呢?
class Solution {
private boolean isSearched = true;
private long preVal = Long.MIN_VALUE;
public boolean isValidBST(TreeNode root) {
LDF(root);
return isSearched;
}
private void LDF(TreeNode node) {
if (node == null || !isSearched) {
return;
}
LDF(node.left);
if (node.val > preVal) {
preVal = node.val;
} else {
isSearched = false;
}
LDF(node.right);
}
}
时间复杂度: O(n)
空间复杂度: O(n)
网上好的解法
思想一致,但是代码简洁很多。使用了一个pre来保存上一个节点,不会存在第一次解法的风险。
class Solution {
private TreeNode pre = null;
public boolean isValidBST(TreeNode root) {
if (root == null) {
return true;
}
Boolean L = isValidBST(root.left);
if (pre != null && pre.val >= root.val) {
return false; // 无论递归多少层,return false后结果始终为false。
}
pre = root;
Boolean R = isValidBST(root.right);
return L && R;
}
}
时间复杂度: O(n)
空间复杂度: O(n)
最后的代码
与网上代码一致。
class Solution {
private TreeNode pre = null;
public boolean isValidBST(TreeNode root) {
if (root == null) {
return true;
}
Boolean L = isValidBST(root.left);
if (pre != null && pre.val >= root.val) {
return false;
}
pre = root;
Boolean R = isValidBST(root.right);
return L && R;
}
}
小结
-
中序遍历二叉搜索树,元素递增。
- 所以遇到应把二叉搜索树与中序遍历相关联。