判断二叉搜索树通俗易懂(C++)

二叉搜索树的定义

二叉搜索树(BST)是二叉树的一种特殊表示形式,它满足如下特性:

  • 每个节点中的值必须大于(或等于)存储在其左侧子树中的任何值。
  • 每个节点中的值必须小于(或等于)存储在其右子树中的任何值。

下面是一个二叉搜索树的例子:

在这里插入图片描述

了解了二叉搜索树的概念之后,下面来看看我验证二叉搜索树的思路:

总体上,定义的意思就是一个结点的左子树的任意一个数字都比该结点小,右子树的任意一个数字都比该结点大。缩小范围,一个结点的左子树中最大的数字都比该结点小,一个结点的右子树中最小的数字都比该结点大。

结论:一个结点的左子树中最大的数字都比该结点小,一个结点的右子树中最小的数字都比该结点大。

求二叉树最大值

//root树为上面的例子
void max(TreeNode* root,int &t){
    if(root){
        if(t<root->val) t=root->val;
        max(root->left,t);
        max(root->right,t);
    }
}
int t=root->val;
max(root,t);

求二叉树最小值

上面的那个函数稍作改动

void min(TreeNode* root,int &t){
    if(root){
        if(t>root->val) t=root->val;
        min(root->left,t);
        min(root->right,t);
    }
}
int t=root->val;
min(root,t);

求左子树最大值和求右子树最小值

利用上面定义的函数可轻易实现这两个功能

int left(TreeNode* root){
    int t=root->left->val;
    max(root->left,t);
    return t;
} 
int right(TreeNode* root){
    int t=root->right->val;
    min(root->right,t);
    return t;
}

上面两个函数已经完成了一半的工作,非常的重要,接下来就是遍历每一个结点,查看是否有左子树中最大值大于等于该结点或右子树最小值小于等于该结点的情况,如果有则将最外层的res的全局变量设为false。最后遍历完之后返回res

遍历

//全局变量res=true
void order(TreeNode* root){
    if(root){
        if(root->left){
            if(root->val<=left(root)) res=false; 
        }
        if(root->right){
            if(root->val>=right(root)) res=false; 
        }
        order(root->left);
        order(root->right);
    }
}

完整代码

class Solution {
public:
    int res=true;
    int left(TreeNode* root){
        int t=root->left->val;
        max(root->left,t);
        return t;
    } 
    int right(TreeNode* root){
        int t=root->right->val;
        min(root->right,t);
        return t;
    }
    void max(TreeNode* root,int &t){
        if(root){
            if(t<root->val) t=root->val;
            max(root->left,t);
            max(root->right,t);
        }
    }
    void min(TreeNode* root,int &t){
        if(root){
            if(t>root->val) t=root->val;
            min(root->left,t);
            min(root->right,t);
        }
    }
    void order(TreeNode* root){
        if(root){
            cout<<root->val<<" ";//输出该结点值
            if(root->left){
                cout<<left(root)<<" ";//输出左子树最大值
                if(root->val<=left(root)) res=false; 
            }
            if(root->right){
                cout<<right(root)<<" ";//输出右子树最小值
                if(root->val>=right(root)) res=false; 
            }
            cout<<endl;//一个结点一行
            //前面三个输出可以去掉,我为了直观的看运行过程才加上去的
            order(root->left);
            order(root->right);
        }
    }
    bool isValidBST(TreeNode* root) {
        order(root);
        return res;
    }
};

运行

用最上面的那个例子来测试
在这里插入图片描述

在这里插入图片描述

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值