习题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-