二叉查找树的判断

题目:给定树的根结点指针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);  

    }  
}; 
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值