您的位置:首页 > 其它

【Leetcode】之Validate Binary Search Tree

2016-08-04 23:50 447 查看

一.问题描述

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 a binary tree node.
* struct TreeNode {
* int val;
* TreeNode *left;
* TreeNode *right;
* TreeNode(int x) : val(x), left(NULL), right(NULL) {}
* };
*/
class Solution {
public:
bool isValidBST(TreeNode* root) {
if(root==NULL) return true;
vector<int> search;
trace(root,search);
int len=search.size();
if(len==1) return true;
for(int i=1;i<len;i++){
if(search[i]<=search[i-1])
return false;
}
return true;
}

void trace(TreeNode* root, vector<int>& search){
if(root==NULL) return;
trace(root->left,search);
search.push_back(root->val);
trace(root->right,search);

}
};

接下来再试试采用非递归的方式遍历二叉树,这个以前没有练过,正好来练练手。
class Solution {
public:
bool isValidBST(TreeNode* root) {
if(root==NULL) return true;
vector<int> search;
trace(root,search);
int len=search.size();
if(len==1) return true;
for(int i=1;i<len;i++){
if(search[i]<=search[i-1])
return false;
}
return true;
}

void trace(TreeNode* root, vector<int>& search){
stack<TreeNode*> tmp;
do{
while(root){
tmp.push(root);
root=root->left;
}
if(tmp.size()>0){
TreeNode* curr = tmp.top();
tmp.pop();
search.push_back(curr->val);
root=curr->right;
}
}while(tmp.size()>0 || root);

}
};
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: