码迷,mamicode.com
首页 > 其他好文 > 详细

验证二叉搜索树(lc98)

时间:2020-02-15 18:41:01      阅读:84      评论:0      收藏:0      [点我收藏+]

标签:span   考题   ==   算法实现   mic   amp   ali   pop   pre   

二叉搜索树

  二叉搜索树是这样的二叉树,树中所有结点满足:左子树所有结点值小于根结点,右子树所有结点值大于根结点。

验证方法

  首先想到的是使用递归方法,如果满足前驱结点 < 根结点 < 后继结点,那么继续向下分别对左右子树进行递归,直到有不满足的情况出现,则返回false。还有一种递归想法(参考题解)是为每个子树设置(low, upper),判断根节点值root是否在区间内,然后对左右子树递归判断,左子树区间设置为(low,root-1),右子树为(root+1,upper),并且该方法可以很容易转化为栈实现,具体参考https://leetcode-cn.com/problems/validate-binary-search-tree/solution/yan-zheng-er-cha-sou-suo-shu-by-leetcode/

  下面是第一种递归算法实现

bool isValidBST(TreeNode* root) {
        if(root == NULL) return true;
        TreeNode* pre = root->left;
        TreeNode* follow = root->right;
        if(pre == NULL && follow == NULL) 
            return true;
        if(pre == NULL){
            while(follow->left) follow = follow->left;
            if(isValidBST(root->right) && root->val < follow->val)
                return true;
            return false;
        }
        if(follow == NULL){
            while(pre->right) pre = pre->right;
            if(isValidBST(root->left) && root->val > pre->val)
                return true;
            return false;
        }
        while(follow->left) follow = follow->left;
        while(pre->right) pre = pre->right;
        if(isValidBST(root->left) && isValidBST(root->right) && root->val < follow->val && root->val > pre->val)
            return true;
        return false;
}

 

  还有一种常见的方法是对二叉树进行中序遍历,根据搜索树的性质可知,中序遍历的序列是递增的。下面使用栈方法进行中序遍历验证二叉搜索树(也可使用递归遍历或莫里斯遍历)。

bool isValidBST(TreeNode* root) {
        vector<TreeNode*> stk;
        TreeNode* cur = root;
        long before = (long)INT_MIN - 1;
        while(cur != NULL || stk.size() != 0){
            while(cur != NULL){
                stk.push_back(cur);
                cur = cur->left;
            }
            cur = stk.back();
            stk.pop_back();
            if(cur->val <= before) return false;
            before = cur->val;
            cur = cur->right;
        }
        return true;
}

 

  

验证二叉搜索树(lc98)

标签:span   考题   ==   算法实现   mic   amp   ali   pop   pre   

原文地址:https://www.cnblogs.com/zz-zhang/p/12312897.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!