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

匿名 (未验证) 提交于 2019-12-03 00:09:02

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

思路很简单每次递归调用一次判断函数就能带回来子树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行代码就可以了... ... ...

易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!