validate binary tree
昨天简书非常不稳定,不知道是我自己网络的原因,还是简书的服务器不稳定。所以昨天写的今天才发。
今天是一道题目,来自LeetCode,难度为Medium,Acceptance为20.3%。
题目如下
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.
解题思路及代码见阅读原文
回复0000查看更多题目
解题思路
首先,老规矩看到二叉树首先想到三种遍历方式。针对该题目,首先想到采用后序遍历的方法最好,即先判断左右子树是不是valid,然后判断根是不是valid。
这样做当然可以,但是时间复杂度却比较高。仔细想想其实这里不是必须使用后序遍历。
所以这里可以这样做,对于一个任意一个节点,若它是左子树,那么它应该比它的父节点小;若它是右子树,那么它应该比它的父节点大。
对于根节点,因为它没有父节点,直接传递最大最小的整数值。
最后我们来看代码。
代码如下
Java版
public class Solution {
public boolean isValidBST(TreeNode root) {
return isValidBST(root, Long.MIN_VALUE, Long.MAX_VALUE);
}
public boolean isValidBST(TreeNode root, long minVal, long maxVal) {
if (root == null) return true;
if (root.val >= maxVal || root.val <= minVal) return false;
return isValidBST(root.left, minVal, root.val) && isValidBST(root.right, root.val, maxVal);
}
}