98. Validate Binary Search Tree

98. 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:

    2
   / \
  1   3

Binary tree [2,1,3], return true.

Example 2:

    1
   / \
  2   3

Binary tree [1,2,3], return false. 

解析

  • 需要注意的是,左子树的所有节点都要比根节点小,而非只是其左孩子比其小,右子树同样。这是很容易出错的一点是,很多人往往只考虑了每个根节点比其左孩子大比其右孩子小。如下面非二分查找树,如果只比较节点和其左右孩子的关系大小,它是满足的。
  • 从根节点开始递归,遍历所有的节点。并且在每个节点处,分别遍历其左右子树,判断其左子树的最大值比其小,右子树的最小值比其大。时间复杂度为O(n^2)。参考:【LeetCode】Validate Binary Search Tree 解题报告
  • 这题实际上简化了难度,因为一般的二叉搜索树是左<=根<右,而这道题设定为左<根<右,那么就可以用中序遍历来做。因为如果不去掉左=根这个条件的话,那么下边两个数用中序遍历无法区分:
    20 20
    / 20 20
  • 它们的中序遍历结果都一样,但是左边的是BST,右边的不是BST。去掉等号的条件则相当于去掉了这种限制条件。参考:98. Validate Binary Search Tree
class Solution_98 {
public:

    //bug
    bool isValidBST_bug(TreeNode* root) {

        if (!root||(!root->right&&!root->left))
        {
            return true;
        }
        
        if (root->left!=NULL&&root->left->val>=root->val)
        {
            return false;
        }
        if (root->right!=NULL&&root->right->val<=root->val)
        {
            return false;
        }
        return isValidBST_bug(root->left) && isValidBST_bug(root->right);
    }

    // 二分查找树的中序遍历结果是一个递增序列
    TreeNode* pre = NULL;
    void InOrder(TreeNode* root,int &res)
    {
        if (!root)
        {
            return;
        }
        InOrder(root->left, res);
        if (!pre)
        {
            pre = root;
        }
        else
        {
            if (root->val<=pre->val)
            {
                res = 0;
            }
            pre = root;
        }

        InOrder(root->right,res);
        return;
    }
    bool isValidBST(TreeNode *root) {

        if (!root)
        {
            return true;
        }
        int res = 1;
        InOrder(root,res);

        if (res==0)
        {
            return false;
        }
        return true;
    }
};

题目来源

    原文作者:ranjiewen
    原文地址: https://www.cnblogs.com/ranjiewen/p/8831998.html
    本文转自网络文章,转载此文章仅为分享知识,如有侵权,请联系博主进行删除。
点赞