题目描述
请实现一个函数,检查一棵二叉树是否为二叉查找树。
给定树的根结点指针TreeNode* root,请返回一个bool,代表该树是否为二叉查找树
方法一,中序遍历存入vector看是否排好序
/* struct TreeNode { int val; struct TreeNode *left; struct TreeNode *right; TreeNode(int x) : val(x), left(NULL), right(NULL) { } };*/
class Checker {
public:
vector<int> temp;
bool checkBST(TreeNode* root) {
// write code here
inorder(root);
for(int i = 1;i < temp.size();++i)
{
if(temp[i-1] > temp[i])
return false;
}
return true;
}
void inorder(TreeNode* root)
{
if(!root)
return;
if(root->left)
inorder(root->left);
temp.push_back(root->val);
if(root->right)
inorder(root->right);
}
};
class Checker {
public:
bool checkBST(TreeNode* root) {
// write code here
if(root == NULL)
return true;
vector<int> ans;
stack<TreeNode *> sta;
TreeNode *r = root;
while(!sta.empty() || r != NULL){
while(r != NULL){
sta.push(r);
r = r->left;
}
if(!sta.empty()){
TreeNode *tmp = sta.top();
sta.pop();
r = tmp->right;
ans.push_back(tmp->val);
}
}
for(int i = 0; i < ans.size() - 1; ++i){
if(ans[i] > ans[i + 1])
return false;
}
return true;
}
};
递归:
class Checker {
public:
bool checkBST(TreeNode* root) {
// write code here
return method2(root,INT_MIN,INT_MAX);
}
bool method2(TreeNode* root,int min,int max)
{
if(root==NULL)
return true;
if(root->val<min||root->val>max)
return false;
return method2(root->left,min,root->val)&&method2(root->right,root->val,max);
}
};