zoukankan      html  css  js  c++  java
  • 【LeetCode】验证二叉搜索树

    【问题】给定一个二叉树,判断其是否是一个有效的二叉搜索树。

    假设一个二叉搜索树具有如下特征:
    节点的左子树只包含小于当前节点的数。
    节点的右子树只包含大于当前节点的数。
    所有左子树和右子树自身必须也是二叉搜索树。

    示例 1:
    输入:
    2
    / 
    1 3
    输出: true
    示例 2:
    输入:
    5
    / 
    1 4
    / 
    3 6
    输出: false
    解释: 输入为: [5,1,4,null,null,3,6]。
    根节点的值为 5 ,但是其右子节点值为 4

    【思路】如何判断一棵二叉树是否为BST,很简单的思路就是:对这棵二叉树进行中序遍历,然后判断其中序遍历后的序列是不是单调递增的序列,如果是,则为一棵BST,否则不是。

    但是二叉树的中序遍历有两个版本,递归版和非递归版本,我们先来看递归版本,其实际就是一个dfs算法,从根节点依次向下深入,在递归体内我们需要设置两个变量min, max来进行数值边界的判断,以使得遍历后的序列为一个单调增序列!

    /**
     * Definition for a binary tree node.
     * struct TreeNode {
     *     int val;
     *     TreeNode *left;
     *     TreeNode *right;
     *     TreeNode(int x) : val(x), left(NULL), right(NULL) {}
     * };
     */
    class Solution {
    public:
        bool dfs(TreeNode* root, long int mi, long int ma){
            if(root == nullptr){
                return true;
            }
            if(root->val <= mi || root->val >= ma) return false;
            else return dfs(root->left, mi, root->val) && dfs(root->right, root->val, ma);
    
        }
    
        bool isValidBST(TreeNode* root) {
            if(root == NULL) return true;
            return dfs(root, INT64_MIN, INT64_MAX);
        }
    };

    我们还可以使用一个堆栈来实现二叉树的费递归版的中序遍历!!!

    /**
     * Definition for a binary tree node.
     * 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 == nullptr) return true;
            TreeNode* pre = nullptr;
            TreeNode* cur = root;
            stack<TreeNode*> sta;
            while(!sta.empty() || cur != nullptr){
                if(cur != nullptr){
                    sta.push(cur);
                    cur = cur->left;
                }else{
                    cur = sta.top();
                    sta.pop();
                    if(pre && cur->val <= pre->val) return false;
                    pre = cur;
                    cur = cur->right;
                }
            }
            return true;
        }
    };
  • 相关阅读:
    redhat 新装后不能联网
    [Linux 命令]df -h
    redhat安装VMware tools的方法
    linux 进入包含空格文件名的文件夹
    Redhat 使用中文安装后更换为英文的设定
    HibernateDaoSupport类的使用
    java中重载与重写的区别
    Servlet中Service方法
    持久化框架Hibernate 开发实例(二)
    持久化框架Hibernate 开发实例(一)
  • 原文地址:https://www.cnblogs.com/zhudingtop/p/11530612.html
Copyright © 2011-2022 走看看