判断给定二叉树是否为排序二叉树

本文剖析了一种错误的二叉排序树判断方法,并详细解释了为何该方法无法正确判断二叉树是否为排序二叉树。此外,还提供了一个正确的判断思路,即通过中序遍历来验证节点值的顺序。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

错误思路:通过判断p->lchild->data <= p->data <= p->rchild->data 是否成立

错误原因: 只能确定一个最小单位的二叉树是否为排序二叉树,而不能确保所有左(右)子树节点都小(大)于根节点

举最简单的例子:下面这样符合判断 条件,但不是二叉排序树



抛开其逻辑错误不说,

分析一下实现代码:(摘自其它博客)

bool Judge(PBinTree pbt)  
{  
     PBinTreeNode   pLeft, pRight;  
     bool    bLeft = false, bRight=false, bRootl=false, bRootr=false;  
     if(pbt == NULL)  
         return true;  
     // 判断根节点  
     pLeft = pbt->left;  
     pRight = pbt->right;  
     if((pLeft && pLeft->data <= pbt->data)||pLeft==NULL)  
     {  
          bRootl = true;  
     }  
     if((pRight && pRight->data >= pbt->data)||pRight==NULL)  
     {  
          bRootr = true;  
     }  
     // 判断左右子树  
     bLeft = Judge(pLeft);  
     bRight = Judge(pRight);  
     // 同时满足条件才叫二叉排序树  
     return( bLeft && bRight && bRootl && bRootr);  
}  

一开始觉得定义四个标志变量是多余,但自己试着实现后发现是必须的,

首先:若只有bRootl,bRootr,那么之后的递归相当于没有做,因为没有保留结果

其次:(仅是自我理解)bRootl,bRootr标志相当于针对当前根节点而言其左右子树(仅儿子辈)是否符合条件

而bLeft,bRight则是(以此根节点的)左(右)子树作为新树的根节点而言,是否符合条件。


正确思路:中序遍历输出时,前驱节点一定比后继节点小

(摘自其他博客)

int   last=0,flag=1;       
int   Is_BSTree(Bitree   T)//判断二叉树T是否二叉排序树,是则返回1,否则返回0     
{     
    if(T->lchild&&flag)   Is_BSTree(T->lchild);     
    if(T->data<last)   flag=0;   //与其中序前驱相比较     
    last=T->data;     
    if(T->rchild&&flag)   Is_BSTree(T->rchild);     
    return   flag;     
}  


评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值