0

2つの非常に大きなツリーがあります。数百万のノードを持つT1と、数百のノードを持つT2です。T2がT1のサブツリーであるかどうかを判断するためのアルゴリズムを作成します

著者は、力ずくの検索ソリューションを提供します。ノードごとに比較するだけです。コードは次のとおりです。

boolean containsTree(TreeNode t1, TreeNode t2) {
    if (t2 == null) return true;
    else return subTree(t1, t2);
}

boolean subTree(TreeNode r1, TreeNode r2) {
    if(r1 == null)
        return false;
    if(r1.data = r2.data){
        if(matchTreee(r1, r2)) return true;
    }
    return ( subTree(r1.left, r2) || subTree(r1.right, r2) );
}

boolean matchTree(TreeNode r1, TreeNode r2){
    if (r2 == null && r1 == null)
        return true;
    if (r1 == null || r2 == null)
        return false; //big tree empty & subtree still not found
    if (r1.data != r2.data)
        return false;
    return (matchTree(r1.left, r2.left) && matchTree(r1.right, r2.right));
}

上記のコードでは、関数の基本ケースに同意しませんmatchTree

if (r2 == null && r1 == null)
    return true;
if (r1 == null || r2 == null)
    return false; // big tree empty & subtree still not found

私の理解によれば、基本的なケースは次のようになります。

    if(r2 == null) return true; //if r2 is null, r2 must match r1 
no matter r1 is null or not
    if(r1 == null) return false; //r1 == null means big tree empty 
and we already know r2 != null, so r2 must not match r1.

確認を手伝ってもらえますか?

ありがとう、

4

1 に答える 1

1

その本の著者はT2 is a subtree of T1あなたとは違う定義を念頭に置いていたように私には思えます。

たとえば、以下の木を考えてみましょう(マッドペイントスキル):

木

著者のコードは、T3をT1のサブツリーと見なしますが、T2とは見なしません。あなたはT2とT3の両方をT1のサブツリーと見なしています。

そうは言っても、あなたのベースケースは「サブツリー」の「自然な」定義にとってより理にかなっていると思います。

C#テストコード(dataタイプ付きint):

var t1 = new TreeNode() { data = 0,
    left = new TreeNode() { data = 1,
        left = new TreeNode() { data = 2 },
        right = new TreeNode() { data = 3, 
            right = new TreeNode() { data = 4 } } } };

var t2 = new TreeNode() { data = 1,
    left = new TreeNode() { data = 2 },
    right = new TreeNode() { data = 3 } };

var t3 = new TreeNode() { data = 1,
    left = new TreeNode() { data = 2 },
    right = new TreeNode() { data = 3,
        right = new TreeNode() { data = 4 } } };
于 2012-09-21T17:32:29.987 に答える