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)的主要内容,如果未能解决你的问题,请参考以下文章