第30天。
恍恍惚惚就一个月了。
今天的题目是Validate Binary Search Tree :
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:
Binary tree [2,1,3], return true.
Example 2:
Binary tree [1,2,3], return false.
昨天的题目也是和BST有关的,但是这里的定义和昨天有点不用,它这里要求左子树的所有节点都比根节点的值要小,右子树的所有的节点的值都比根节点的值大.
我们可以发现这样定义的BST的中序遍历一定是升序的,所以我们可以用先序遍历的方式来做:
long long vmax = LLONG_MIN ;
bool isValidBST1 ( TreeNode * root ) {
if ( root == NULL ) return true ;
if ( ! isValidBST ( root -> left ) ) return false ;
if ( root -> val <= vmax ) return false ;
return isValidBST ( root -> right );
既然使用中序遍历做的,那么我们就可以用非递归版的先序遍历来加快:
long long vmax = LLONG_MIN ;
bool isValidBST ( TreeNode * root ) {
if ( vmax >= root -> val ) return false ;
上面都是用long long
来记录最大值,这时因为如果用INT_MIN
来做的话,[INT_MIN,INT_MIN]
这样的测例就会出错,我是用long long
来解决这个问题的,但是dicuss
中有一些其他方法:
bool isValidBST ( TreeNode * root ) {
return validate ( root , prev );
bool validate ( TreeNode * node , TreeNode * & prev ) {
if ( node == NULL ) return true ;
if ( ! validate ( node -> left , prev )) return false ;
if ( prev != NULL && prev -> val >= node -> val ) return false ;
return validate ( node -> right , prev );
bool isValidBST ( TreeNode * root ) {
return isValidBST ( root , NULL , NULL );
bool isValidBST ( TreeNode * root , TreeNode * minNode , TreeNode * maxNode ) {
if ( minNode && root -> val <= minNode -> val || maxNode && root -> val >= maxNode -> val )
return isValidBST ( root -> left , minNode , root ) && isValidBST ( root -> right , root , maxNode );