题目
给你一个二叉树的根节点 root ,判断其是否是一个有效的二叉搜索树。
有效 二叉搜索树定义如下:
- 节点的左子树只包含 小于 当前节点的数。
- 节点的右子树只包含 大于 当前节点的数。
- 所有左子树和右子树自身必须也是二叉搜索树。
示例 1:
输入: root = [2,1,3]
输出: true
题解
需要注意的是,左右子树都是二叉搜索树时,整体不一定是二叉搜索树,当前节点需要大于左子树中最大的节点,小于右子树中最小的节点
方式一:递归
第一时间想到递归的同时维护一个最大值和最小值,如果是右节点就比较右子树的最大值,如果是左节点就比较左子树的最小值,但这样实现起来很麻烦。
题解这种方法就很灵性了,通过范围比较是否符合要求。
public boolean isValidBST(TreeNode root) {
return isValidBST(root, Long.MIN_VALUE, Long.MAX_VALUE);
}
public boolean isValidBST(TreeNode node, long lower, long upper) {
if (node == null) {
return true;
}
if (node.val >= upper || node.val <= lower) {
return false;
}
return isValidBST(node.left, lower, node.val) && isValidBST(node.right, node.val, upper);
}
方式二:迭代
由题意知道中序遍历后的结果是升序的,如果不是就不是二叉搜索树。
// 迭代实现中序遍历
public boolean isValidBST(TreeNode root) {
Stack<TreeNode> stack = new Stack<>();
long last = Long.MIN_VALUE;
while (!stack.isEmpty() || root != null) {
while (root != null) {
stack.push(root);
root = root.left;
}
root = stack.pop();
if (root.val <= last) {
return false;
}
last = root.val;
root = root.right;
}
return true;
}
总结
算法:递归、迭代