#include<iostream>
using namespace std;
#include<vector>
/**
请实现一个函数,
检查一棵二叉树是否为二叉查找树。
给定树的根结点指针TreeNode* root,
请返回一个bool,代表该树是否为二叉查找树。
算法:
二叉树是否是二叉搜索树的充分必要条件是:
它的中序遍历序列是单调非递减序列
用vector向量存储对于二叉树进行中序遍历后的序列
然后分别检查序列中是否包含有紧邻逆序对
数组有序的充要条件是紧邻逆序对的个数为0
**/
struct TreeNode {
int val;
struct TreeNode *left;
struct TreeNode *right;
TreeNode(int x) :
val(x), left(NULL), right(NULL) {
}
};
class Checker {
public:
bool checkBST(TreeNode* root) {
// write code here
if(root==NULL){
return true;
}
if(root->left==NULL and root->right==NULL){
return true;
}
vector<int> arr;
// 对输入的二叉树进行中序遍历
vector<TreeNode*> helper_stack;
while(root!=NULL){
helper_stack.push_back(root);
root=root->left;
}
// helper_stack 辅助栈中保存的是以二叉树根节点为起始点的左侧链
TreeNode* temp;
while(helper_stack.size()>0){
// 保证每次进入循环时,辅助栈的栈顶元素都是需要被访问的元素
// 且当前栈顶的节点的左孩子一定为空,右孩子不一定为空
temp=helper_stack[helper_stack.size()-1];
helper_stack.pop_back();
arr.push_back(temp->val);
if(temp->right!=NULL){
temp=temp->right;
while(temp!=NULL)
{
helper_stack.push_back(temp);
temp=temp->left;
}
}
}
for(unsigned int i=1;i<arr.size();i++){
if(arr[i]<arr[i-1]){
return false;
}
}
return true;
}
};