题目:给定树的根结点指针TreeNode* root,请返回一个bool,代表该树是否为二叉查找树。
方法一
二叉查找树中序遍历后的结果是有序的,根据这个结果,可以中序遍历二叉树,并把遍历结果存放在一个数组里面,然后判断这个数组大小是否是有序数组,如果是有序数组,则是二叉查找树,否则就不是。时间复杂度是O(N),空间复杂度O(N)。
class Checker {
public:
vector<int> result;
//中序遍历二叉树,并将节点值存入vector中
void check(TreeNode* root) {
if(root == nullptr)
return;
check(root->left);
result.push_back(root->val);
check(root->right);
}
bool checkBST(TreeNode* root) {
if(root == nullptr)
return false;
if(root && !root->left && !root->right)
return true;
check(root);
//判断中序遍历结果是否有序
int len = result.size();
for(int i = 1; i < len; ++i){
if(result[i-1] >= result[i])
return false;
}
return true;
}
};
方法二
根据二叉查找树的定义来判断,二叉查找树所有左子树的节点小于根节点,所有右子树的节点大于根节点,并且左右子树也是二叉查找树。所以在递归的过程中,我们只需要传递两个参数(当前根节点对应的二叉树的所有节点的最大值和最小值),同时不断的更新这两个参数,如果当前节点的值不在这两个数范围中,则直接返回false,否则继续递归。
class Checker {
public:
bool checkBST(TreeNode* root) {
return method2(root,INT_MIN,INT_MAX);
}
bool check(TreeNode* root,int min,int max)
{
if(root == NULL)
return true;
if(root->val < min || root->val > max)
return false;
return check(root->left, min, root->val) && check(root->right, root->val, max);
}
};