zoukankan      html  css  js  c++  java
  • 【Validate Binary Search Tree】cpp

    题目:

    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.

    代码:

    /**
     * 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) return true;
                stack<TreeNode *> sta;
                vector<int> traversal;
                TreeNode *p = root;
                while ( !sta.empty() || p )
                {
                    if (p){
                        sta.push(p);
                        p = p->left;
                    }
                    else{
                        p = sta.top();
                        sta.pop();
                        if ( !traversal.empty() && traversal[traversal.size()-1]>=p->val ) return false;
                        traversal.push_back(p->val);
                        p = p->right;
                    }
                }
                return true;
        }
    };

    tips:

    中序遍历BST;并保留每次访问的元素;如果中序遍历的前一个元素不小于后一个元素,则返回false;全部遍历过后无问题,则返回true。

    题目中有一个test case是:[-2147483648],即INT_MIN。由于有这个非常极端的case存在,之前那种设一个pre = INT_MIN的办法就行不通了,暂时老老实实用一个vector来代替。

    ==========================================

    一开始刷这道题总想用递归,后来看的之前的代码,BST这种判断有效的,用中序遍历可能更好一些。

    /**
     * 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) {
                stack<TreeNode*> sta;
                TreeNode* curr = root;
                vector<int> vals;
                while ( !sta.empty() || curr )
                {
                    if ( curr )
                    {
                        sta.push(curr);
                        curr = curr->left;
                    }
                    else
                    {
                        curr = sta.top();
                        vals.push_back(curr->val);
                        sta.pop();
                        if ( vals.size()>1 && vals[vals.size()-1]<=vals[vals.size()-2] ) return false;
                        curr = curr->right;
                    }
                }
                return true;
        }
    };
  • 相关阅读:
    【赵强老师】使用Docker Compose进行服务编排
    【赵强老师】Weblogic域和域的组成
    【赵强老师】管理Docker镜像
    3. 清理统一审计 AUD$UNIFIED 基表部份数据
    4. AUD$UNIFIED 基表及 分区键创建索引
    2.更改统一审计AUD$UNIFIED基表 默认表空间
    1.更改统一审计AUD$UNIFIED 分区为1天
    9. 将APEX18.2 升级到 APEX19.2 详细步骤
    1.2 安装中文语言包
    通过VBOX 导入系统工具 搭建APEX开发环境
  • 原文地址:https://www.cnblogs.com/xbf9xbf/p/4508313.html
Copyright © 2011-2022 走看看