演習4.3はバイナリ検索ツリーです(25ポイント)

最初に最初の方法を紹介し、次にトラバーサルを紹介します。

考え方は非常に単純で、判断関数を再帰的に呼び出すたびに、サブツリーTの最大値と最小値を戻すことができます。さらに、バイナリ検索ツリーの定義の1つのポイントに注意してください。簡単に言えば、ルートノードの値は、左側のサブツリーの最大値より大きく、右側のサブツリーの最小値より小さくなければなりませんルートノードと左右の子のサイズの関係を判断するだけではいけません。

/*后序遍历判断*/
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);
}

 

方法1では、25ポイントの問題を解決するために実際には25行のコードが必要ですが、問題が多すぎます...

したがって、コードワードが少ないメソッドがあります。バイナリ検索ツリーの中次トラバーサルのシーケンスは減少しません。このプロパティを使用して、プレオーダートラバーサルを1回実行し、グローバル変数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行のコードで十分です......

おすすめ

転載: blog.csdn.net/yiwaite/article/details/101035420