判别给定二叉树是否为二叉排序树(严题集9.31/LeetCode98/LeetCode面试题0405)

一、具体要求

111111

二、分析

值得注意的是,由于左子树只包含小于当前节点的数,结点的右子树只包含大于当前节点的数,所以,除了判断每个根节点root->left>data < root->data和root->data > root->right->data是否成立外(当root,root->left和root->right存在),还需要额外判断root->left的右子树中是否存在过大的数,如果root->left的右子树中存在大于等于root->data的数,那么这个输就不是二叉排序树。
如下图所示,3的右子树数值为5,大于整个树根节点的值4。

4
1
6
0
3
5
7
2
5

同理,如果root->right的左子树存在过小的数,即存在小于等于root->data的数,这个树也不是二叉排序树。
如下图所示,5的左子树结点数值为2,小于整个树根节点的值4。

4
1
8
0
3
5
9
2
6

三、采用严题集定义的代码

严题集上对于二叉树的定义为:

typedef struct BiTNode{
	TElemType data;
	struct BiTNode *lchild,*rchild;
}BiTNode,*BiTree;

算法:

bool ISBST(BiTree root)
//9-31 判断是否为二叉排序树 
{
    if(!root) return true;
    bool judge1=true,judge2=true;
    if(root->lchild)
    {
        if(root->lchild->data>=root->data) return false;
        if(root->lchild->rchild)
        {
            BiTree temp=root->lchild->rchild;
            while(temp)
            {
                if(temp->data>=root->data) return false;
                temp=temp->rchild;
            }
        }
        judge1=ISBST(root->lchild);
    }
    if(root->rchild)
    {
        if(root->data>=root->rchild->data) return false;
        if(root->rchild->lchild)
        {
            BiTree temp=root->rchild->lchild;
            while(temp)
            {
                if(temp->data<=root->data) return false;
                temp=temp->lchild;
            }
        }
        judge2=ISBST(root->rchild);
    }
    if(judge1==true&&judge2==true) return true;
    else
    return false;

四、采用LeetCode平台定义的代码

LeetCode平台对二叉树的定义:

struct TreeNode
{
     int val;
     struct TreeNode *left;
     struct TreeNode *right;
};

算法:

bool isValidBST(struct TreeNode* root)
{
    if(!root) return true;
    bool judge1=true,judge2=true;
    if(root->left)
    {
        if(root->left->val>=root->val) return false;
        if(root->left->right)
        {
            struct TreeNode *temp=root->left->right;
            while(temp)
            {
                if(temp->val>=root->val) return false;
                temp=temp->right;
            }
        }
        judge1=isValidBST(root->left);
    }
    if(root->right)
    {
        if(root->val>=root->right->val) return false;
        if(root->right->left)
        {
            struct TreeNode *temp=root->right->left;
            while(temp)
            {
                if(temp->val<=root->val) return false;
                temp=temp->left;
            }
        }
        judge2=isValidBST(root->right);
    }
    if(judge1==true&&judge2==true) return true;
    else return false;
}

五、算法效率

在这里插入图片描述
算法效率还是很高的!

  • 1
    点赞
  • 17
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 1
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

雨林木风11

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值