习题4.3 是否二叉搜索树 (25 分)

先介绍第一种方法,后序遍历。

思路很简单每次递归调用一次判断函数就能带回来子树T的最大值和最小值。另外要注意二叉搜索树的定义中的一点,简单来说就是根结点的值一定大于左子树的最大值,小于右子树的最小值。千万不要仅仅判断根结点与左右孩子大小的关系。

/*后序遍历判断*/
bool preJudge(BinTree T, int *minT, int *maxT)
{
    int lmin,lmax,rmin,rmax;
    bool ans1 = false, ans2 = false;
    if(T==NULL) return true;//递归基
    if((T->Left&&preJudge(T->Left,&lmin,&lmax)&&T->Data>lmax)||!T->Left)
        ans1 = true;//左子树为空,左子树为BST;左子树不为空则判断左子树是否为BST,再判断根结点是否大于左子树的最大值
    if((T->Right&&preJudge(T->Right,&rmin,&rmax)&&T->Data<rmin)||!T->Right)
        ans2 = true;//同上
    if(ans1&&ans2)
    {
        if(T->Left == NULL) *minT = T->Data;//左子树为空,那么T的最小值为T->Data;
        else *minT = lmin;
        if(T->Right == NULL) *maxT = T->Data;//同上
        else *maxT = rmax;
        return true;
    }
    else return false;
}
bool IsBST(BinTree T)//统一接口
{
    int minT,maxT;
    return preJudge(T,&minT,&maxT);
}

 

方法一居然要25行代码才能解决一个25分的题,是不是太麻烦了... ... ...

所以我们有码字更少的方法,二叉搜索树的中序遍历的序列是非递减的,利用这个性质我们跑一遍前序遍历即可,设置一个全局变量pre,判断序列是否单调。

/*中序遍历判断*/
int pre = -1;
bool IsBST(BinTree T)
{
	if(!T) return true;
	IsBST(T->Left);
	if(T->Data < pre) return false;
	else pre = T->Data;
	IsBST(T->Right);
	return true;
}	

没想到吧,10行代码就可以了... ... ...

  • 7
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 9
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值