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.

    confused what"{1,#,2,3}"means? > read more on how binary tree is serialized on OJ.


    OJ's Binary Tree Serialization:

    The serialization of a binary tree follows a level order traversal, where '#' signifies a path terminator where no node exists below.

    Here's an example:

       1
      / 
     2   3
        /
       4
        
         5
    
    The above binary tree is serialized as"{1,2,3,#,#,4,#,#,5}".
    二叉搜索树:若是所有结点互不相等,满足:在任一结点r的左(右)子树中,所有结点(若存在)均小于(大于)r。更一般性的特点是:任何一棵二叉树是二叉搜索树,当且仅当其中序遍历序列单调非降。题中提示,左、根、右,没有相等的情况。
    方法一:中序遍历
    思路:在中序遍历的过程中比较相邻的两个结点值的大小,看是否为非降型。使用队列一次只能看一个结点值的大小,所以需要另外一个变量来保存前一结点的值。代码如下:
     
     1 /**
     2  * Definition for binary tree
     3  * struct TreeNode {
     4  *     int val;
     5  *     TreeNode *left;
     6  *     TreeNode *right;
     7  *     TreeNode(int x) : val(x), left(NULL), right(NULL) {}
     8  * };
     9  */
    10 class Solution {
    11 public:
    12     bool isValidBST(TreeNode *root) 
    13     {
    14         
    15         stack<TreeNode *> stk;
    16         TreeNode *pre=root;
    17         TreeNode *cur=root;
    18 
    19         while(cur|| !stk.empty())
    20         {
    21             if(cur)
    22             {
    23                 stk.push(cur);
    24                 cur=cur->left;
    25             }
    26             else
    27             {
    28                 cur=stk.top();
    29                 stk.pop();
    30                 //判断语句
    31                 if(pre&&cur->val < pre->val)
    32                     return false;
    33                 pre=cur;
    34 
    35                 cur=cur->right;
    36             }
    37         }
    38         return true;    
    39     }
    40 };

    方法二:

    可以通过中序遍历将二叉树的结点值存入向量中,然后遍历向量看是否满足非降性。为熟悉递归写法,下面的二叉树的遍历过程为递归版。

     1 class Solution {
     2 public:
     3     bool isValidBST(TreeNode *root) 
     4     {
     5         if(root==NULL)  return true;
     6         vector<int> nodeVal;
     7         inorderTrav(root,nodeVal);
     8         for(int i=0;i<nodeVal.size()-1;++i)
     9         {
    10             if(nodeVal[i]>=nodeVal[i+1])
    11                 return false;
    12         }
    13 
    14         return true;        
    15     }
    16 
    17     void inorderTrav(TreeNode *root,vector<int> &nodeVal)
    18     {
    19         if(root==NULL)  return;
    20         inorderTrav(root->left,nodeVal);
    21         nodeVal.push_back(root->val);
    22         inorderTrav(root->right,nodeVal);
    23     }
    24 };

    方法三:整体递归

    利用二叉搜索树的特征,左<根<右。参考这里

     1 class Solution {
     2 public:
     3     bool isValidBST(TreeNode *root) 
     4     {
     5         return isValid(root,LONG_MIN,LONG_MAX);
     6     }
     7     bool isValid(TreeNode * root,long min,long max)
     8     {
     9         if(root==NULL)  return true;
    10         if(root->val<=min||root->val>=max)   return false;
    11         //                       左<根                            根<右
    12         return isValid(root->left,min,root->val)&&isValid(root->right,root->val,max);
    13     }
    14 };
     
  • 相关阅读:
    Eclipse IDE中Android项目打红叉的解决方法
    控件:PopupWindow 弹出窗口(基本操作)
    控件:AnalogClock与DigitalClock 时钟组件
    四大组件之一 BroadcastReceiver (拦截短信并屏蔽系统的Notification .)
    四大组件之一 文件存储_文本文件
    控件:Chronometer 计时器(定时震动)
    计算页面执行时间的两种方法
    URL解析的几种模式以及拟静态重定向问题
    SSH 文件上传错误:encountered 1 errors during the transfer终极解决方法:
    php过滤提交信息防注入
  • 原文地址:https://www.cnblogs.com/love-yh/p/7001721.html
Copyright © 2011-2022 走看看