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.
- 思路
判断给定的二叉树是否是合法的二叉搜索树。法一:暴力判断。先判断子树的所有节点的值是否符合当前根节点的值,然后再一一判断子树。时间复杂度为O(n2)法二:对方法一的优化。记录当前子树的左右值,先判断当前节点的左右子树根节点值是否符合,然后更新子树的值域递归判断。时间复杂度为O(n)法三:中序遍历判断。递归左子树并记录前一个节点,然后判断根节点与前一个节点的值是否符合,接着判断右子树值的情况。时间复杂度为O(n)
//法一
/**
* Definition for binary tree
* public class TreeNode {
* int val;
* TreeNode left;
* TreeNode right;
* TreeNode(int x) { val = x; }
* }
*/
public class Solution {
public boolean isValidBST(TreeNode root) {
if(root == null)
return true;
return isValidSubTree(root.left, root.val, true) && isValidSubTree(root.right, root.val, false) &&
isValidBST(root.left) && isValidBST(root.right);
}
//判断子树的值是否符合根节点的取值
public boolean isValidSubTree(TreeNode node, int rootV, boolean isLeft){
if(node == null)
return true;
if(isLeft && node.val < rootV){
return isValidSubTree(node.left, rootV, true) && isValidSubTree(node.right, rootV, true);
}
if(!isLeft && node.val > rootV){
return isValidSubTree(node.left, rootV, false) && isValidSubTree(node.right, rootV, false);
}
return false;
}
}
//法二
public class Solution {
public boolean isValidBST(TreeNode root) {
if(root == null)
return true;
return isValidSubTree(root, null, null);
}
public boolean isValidSubTree(TreeNode node, Integer lowV, Integer highV){
if(node == null)
return true;
Integer midV = node.val;
return (lowV == null || midV > lowV) && (highV == null || midV < highV) &&
isValidSubTree(node.left, lowV, midV) && isValidSubTree(node.right, midV, highV);
}
}
//法三
public class Solution {
private TreeNode pre = null;
public boolean isValidBST(TreeNode root) {
if(root == null)
return true;
if(isValidBST(root.left)){
if(pre != null && pre.val >= root.val){
return false;
}
pre = root;
return isValidBST(root.right);
}
return false;
}
}