判断给定的数是不是合法的BST。即当前节点值比他左子树大,比右子树小。

思路一:递归,考虑所有可能。

1. 为空是返回true

2. 用flag记录左子树返回的合法性。考虑左子树不空的时候,那么要根要比左子树的最右下角要大。

3. flag为真且右子树也为真则返回真。考虑右子树时,根要比右子树的最左小。

/**
 * 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) return true;
        bool flag = true;
        if (root -> left != NULL)
        {
            if (root -> left -> right == NULL)
            {
                if (root -> val > root -> left -> val)
                    flag = isValidBST(root -> left);
                else
                    return false;
            }
            else
            {
                TreeNode *lr = root -> left -> right;
                while(lr -> right) lr = lr -> right;
                if (root -> val > root -> left -> val && root -> val > lr -> val)
                    flag = isValidBST(root -> left);
                else
                    return false;
            }
        }
        if (root -> right != NULL)
        {
            if (root -> right -> left == NULL)
            {
                if (root -> val < root -> right -> val)
                    return flag && isValidBST(root -> right);
                else
                    return false;
            }
            else
            {
                TreeNode *rl = root -> right -> left;
                while(rl -> left) rl = rl -> left;
                if (root -> val < root -> right -> val && root -> val < rl -> val)
                    return flag && isValidBST(root -> right);
                else
                    return false;
            }
        }
        return flag;
    }
};
View Code

相关文章: