LeetCode 98. Validate Binary Search Tree

Posted yy-1046741080

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了LeetCode 98. Validate Binary Search Tree相关的知识,希望对你有一定的参考价值。

题意:给出头结点,让你判断这颗树是不是二叉搜索树。

 

思路:

  • 很显然,对于一棵二叉搜索树,其左右子树肯定也是二叉搜索树;
  • 因此,递归思路:如果左右子树都是BST,并且该根结点也符合规律(小于左子树的最小结点,小于右子树的最大结点)
  • 递归边界:如果是空节点,那么返回true;
 1 /**
 2  * Definition for a binary tree node.
 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     // 得到值最大的结点
13     long long getMore(TreeNode* root)
14         if(root==NULL)
15             return -2333333333;
16         
17         else
18             TreeNode* tmp=root;
19             while(tmp->right!=NULL)
20                 tmp=tmp->right;
21             
22             return tmp->val;
23         
24     
25     // 得到值最小的结点
26     long long getLess(TreeNode* root)
27         if(root==NULL)
28             return 2333333333;
29         
30         else
31             TreeNode* tmp=root;
32             while(tmp->left!=NULL)
33                 tmp=tmp->left;
34             
35             return tmp->val;
36         
37     
38     
39     bool isValidBST(TreeNode* root) 
40         if(root==NULL)
41             return true;
42         
43         long long v1=getMore(root->left);
44         long long v2=getLess(root->right);
45         return v1<root->val && v2>root->val && isValidBST(root->left) && isValidBST(root->right);
46     
47 ; 
  • 我在实现的时候偷了一点懒;因为对于树结点val属性,在int的范围之内;因此我就使用long long和超过int范围的数来处理左右子树为空的情况(因为为空,肯定是符合二叉排序树的情况!)。

 

列出,在leetcode中,效率最高的代码:

思路很简单,BST的特点在于中序遍历是递增顺序的,因此使用非递归中序遍历,边遍历,边判断;如果中途发现不对,直接返回;

 

 1 /**
 2  * Definition for a binary tree node.
 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         stack<TreeNode*> s;
14         int pre = INT_MAX;
15         int f = 0;
16         while(!s.empty() || root)
17         
18             while(root)
19             
20                 s.push(root);
21                 root = root->left;
22             
23             root = s.top();
24             s.pop();
25             if(f && root->val <= pre)
26                 return false;
27             pre = root->val;
28             f++;
29             root = root->right;
30         
31         return true;
32     
33     
34 ;

 

以上是关于LeetCode 98. Validate Binary Search Tree的主要内容,如果未能解决你的问题,请参考以下文章

Leetcode 98. Validate Binary Search Tree

leetcode 98 - Validate Binary Search Tree

Leetcode 98. Validate Binary Search Tree

leetcode [98]Validate Binary Search Tree

LeetCode 98. Validate Binary Search Tree

[LeetCode_98]Validate Binary Search Tree