题目
Given a binary tree, determine if it is a valid binary search tree (BST).
Assume a BST is defined as follows:
- The left subtree of a node contains only nodes with keys less than the node's key.
- The right subtree of a node contains only nodes with keys greater than the node's key.
- Both the left and right subtrees must also be binary search trees.
Example 1:
2 / \ 1 3Binary tree
[2,1,3]
, return true.
Example 2:
1 / \ 2 3Binary tree
[1,2,3]
, return false.
题意
给定一个二叉树,判断其是否是一个二叉搜索树(BST)。(注意:二叉搜索树定义)
分析及代码
方法1(假设法):
- 【假设】假设该树是二叉搜索树,那么中序遍历的结果,是从小到大排列。(排列顺序中,若不符合此要求,说明非二叉搜索树。)
public class Solution {
List<TreeNode> orders = new LinkedList<>();
public boolean isValidBST(TreeNode root) {
getTheOrder(root);
for(int i =0;i <orders.size()-1;i++){
if(orders.get(i).val >= orders.get(i+1).val){
return false;
}
}
return true;
}
public void getTheOrder(TreeNode root){
if(root == null) return ;
getTheOrder(root.left);
orders.add(root);
getTheOrder(root.right);
}
}
方法2(局部边缘设定):
- 【 局部边缘 】要想弄清边缘,就必须清楚二叉搜索树的定义。拿左子树的 left 结点举例,它一定时比root要小的(上界限制),意思也就是说其父节点构成紧密的限制。而于此同时,你也应该确定这个东西在没在某棵子树的右侧,最近的为下界。
- 【举例】 2的上界 为3, 下界为1.(上界,下界 都是是最近的)
1 \ 3 / 2
public class Solution {
public boolean isValidBST(TreeNode root) {
return isValidBSTHelper(root, null, null);
}
private boolean isValidBSTHelper(TreeNode root, Integer leftBound, Integer rightBound) {
// recursively pass left and right bounds from higher level to lower level
if (root == null) {
return true;
}
if (leftBound != null && root.val <= leftBound || rightBound != null && root.val >= rightBound) {
return false;
}
return isValidBSTHelper(root.left, leftBound, root.val) && isValidBSTHelper(root.right, root.val, rightBound);
}
}