Leetcode题解(30)

Posted

tags:

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

98. Validate Binary Search Tree

题目

技术分享

分析: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         if(NULL == root)
14             return true;
15         vector<int> res;
16         inOrderTraversal(root,res);
17         for(int i=1;i<res.size();i++)
18         {
19             if(res[i]<=res[i-1])
20                 return false;
21         }
22         return true;
23     }
24     void inOrderTraversal(TreeNode* root,vector<int> &res)
25     {
26         if(NULL==root)
27             return;
28         inOrderTraversal(root->left,res);
29         res.push_back(root->val);
30         inOrderTraversal(root->right,res);
31         
32     }
33 };

上面的实现中,使用了一个vector,需要额外的O(n)空间,但是仔细一想,当在保存某一个之值时,只需要判断在它之前的那个数是否小于它,如果小于,则继续遍历,如果不小于,则可以返回false。

代码如下,每次递归调用的时候,都将当前已经遍历的最大数字保存在key中即可

 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         if(NULL == root)
14             return true;
15         
16         long long key = -2147483649;
17         return inOrderTraversal(root,key);
18         
19     }
20     bool inOrderTraversal(TreeNode* root,long long &key)
21     {
22         if(NULL==root)
23             return true;
24         bool flag = inOrderTraversal(root->left,key);
25         if(flag == false)
26             return false;
27         if(root->val <= key)
28         {
29             return false;
30         }
31         key = root->val;
32         flag = inOrderTraversal(root->right,key);
33         if(flag == false)
34             return false;
35         return true;
36         
37 
38             
39         
40     }
41 };

 

以上是关于Leetcode题解(30)的主要内容,如果未能解决你的问题,请参考以下文章

LeetCode第 30 场双周赛题解

LeetCode 热题 HOT 100 完整题解笔记&知识点分类 C++代码实现

LeetCode:搜索二维矩阵题解

Leetcode题解(24)

Leetcode题解(25)

30秒就能看懂的JavaScript 代码片段