[LeetCode]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.

思路1:每个节点检查:1.所有左节点是否都小于当前节点。

            2.所有右节点是否都大于当前节点。

分析:这种解法有个很明显的弊端,就是做了很多重复的计算,复杂度为o(n^2),效率比较低。

完成时间:40分钟

以下是AC代码:

/**
 * Definition for binary tree
 * struct TreeNode {
 *     int val;
 *     TreeNode *left;
 *     TreeNode *right;
 *     TreeNode(int x) : val(x), left(NULL), right(NULL) {}
 * };
 */
class Solution {
public:
    bool isValidBST(TreeNode *root) 
    {
        if(root == NULL)    return true;
        
        return isLessThan(root->left, root->val) && isGreaterThan(root->right, root->val) && isValidBST(root->right) && isValidBST(root->left);
    }
    
    bool isLessThan(TreeNode *node, int val)
    {
        if(node == NULL)    return true;
        
        return node->val<val && isLessThan(node->left, val) && isLessThan(node->right, val);
    }
    
    bool isGreaterThan(TreeNode *node, int val)
    {
        if(node == NULL)    return true;
        
        return node->val>val && isGreaterThan(node->left, val) && isGreaterThan(node->right, val);
    }
};

 

思路2:还想到一种更好的解法,BST的中序遍历是排序的,所以可以考虑到对树进行遍历,将每次遍历到的节点依次记录在一个容器中,遍历完判断是否有序即可,这种做法虽然时间优化到了o(n),但是同时也消耗了o(n)的空间。我们稍作优化,其实我们不必记录所有的节点,只需记录我们上一次遍历到的节点,然后判断当前节点是否比上次一个节点的值小即可。

以下是AC代码:

/**
 * Definition for binary tree
 * struct TreeNode {
 *     int val;
 *     TreeNode *left;
 *     TreeNode *right;
 *     TreeNode(int x) : val(x), left(NULL), right(NULL) {}
 * };
 */
class Solution {
public:
    bool isValidBST(TreeNode *root) 
    {
        TreeNode *prev=NULL;
        
        return isValid(root, prev);
    }
    
    bool isValid(TreeNode *node, TreeNode *&prev)
    {
        if(node == NULL)    return true;
        
        if(!isValid(node->left, prev))
        {
            return false;
        }
        
        if(prev!=NULL && node->val<=prev->val)
        {
            return false;
        }
        
        prev=node;
        return isValid(node->right, prev);
    }
};

  本博客内容与代码均为作者Jarvis原创,如若转载请注明。

posted @ 2014-12-05 15:02  Jarvis_Wu  阅读(148)  评论(0编辑  收藏  举报