zoukankan      html  css  js  c++  java
  • LeetCode_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.
    

      思路:中序遍历的结果正好是二分查找树对应的数据的顺序,所以先中序遍历数据,然后检查遍历的结果是不是递增的

    /**
     * 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 check(vector<int> &a)
        {
            if(a.size() == 1) return true;
            for(int i = 1; i< a.size(); i++)
              if(a[i] <= a[i-1])
                    return false;
            return true;
       }
        bool isValidBST(TreeNode *root) {
            // Start typing your C/C++ solution below
            // DO NOT write int main() function
            if(root == NULL ) return true ;
            vector<int> inorder ;
            stack<TreeNode *> myS;
           // myS.push(root);
            TreeNode *p = root;
            while(!myS.empty()||p){
               while(p){
                 myS.push(p);
                 p = p->left;
               }
               p = myS.top();myS.pop();
               inorder.push_back(p->val) ;
               p = p->right ;
            }
            
            return check(inorder) ;
            
        }
    };

     改进版本:访问每个数据的时候就进行检查,奇怪的是小数据时时间减小一半,大数据竟然比上面的用时还要多

     bool isValidBST(TreeNode *root) {
            // Start typing your C/C++ solution below
            // DO NOT write int main() function
            if(root == NULL ) return true ;
    
            stack<TreeNode *> myS;
           // myS.push(root);
            TreeNode *p = root;
            int flag = 0;
            int value ;
            while(!myS.empty()||p){
               while(p){
                 myS.push(p);
                 p = p->left;
               }
               p = myS.top();
               myS.pop();
              
               if(flag){
                   
                  if( p->val <= value)
                      return false;
                   
               }else{
                   
                   flag = 1;
                 
               }
               value  = p->val;
               p = p->right ;
            }
            return true ;
            
        }
    --------------------------------------------------------------------天道酬勤!
  • 相关阅读:
    Java 实现 蓝桥杯 生兔子问题
    Java实现 蓝桥杯 基因牛的繁殖
    Java实现 蓝桥杯 基因牛的繁殖
    Java实现 蓝桥杯 基因牛的繁殖
    Java实现 LeetCode 33 搜索旋转排序数组
    Java实现 LeetCode 33 搜索旋转排序数组
    Java实现 LeetCode 33 搜索旋转排序数组
    深入探究VC —— 资源编译器rc.exe(3)
    深入探究VC —— 编译器cl.exe(2)
    深入探究VC —— 编译器cl.exe(1)
  • 原文地址:https://www.cnblogs.com/graph/p/3024428.html
Copyright © 2011-2022 走看看