1

2 つのバイナリ ツリーがある場合、すべてのノードの要素が等しいかどうかを確認するにはどうすればよいでしょうか。

この問題を解決する方法についてのアイデアはありますか?

4

9 に答える 9

7

並列ツリー トラバーサルを実行します。順序を選択します (事前順序、事後順序、順序順)。現在のノードに格納されている値が異なる場合はいつでも、2 つのツリーも異なります。左側のノードの 1 つが null で、もう 1 つがそうでない場合、ツリーは異なります。右のノードについても同様です。

于 2009-06-15T02:02:35.953 に答える
2

ノードの順序は重要ですか? この回答では、次の2つのツリーがあると想定しています:

  1       1
 / \     / \
3   2   2   3

比較ではノードの位置と順序が考慮されるため、等しくありません。

いくつかのヒント

  • 2 つの空の木が等しいことに同意しますか?
  • 同一のノード値を持つルート ノードのみを持つ 2 つのツリーは等しいことに同意しますか?
  • このアプローチを一般化できませんか?

もう少し正確に

次のジェネリック ツリーを検討してください。

       rootnode(value=V)
           /      \
          /        \
      --------    ------- 
     |  left  |  | right |
     | subtree|  |subtree|
      --------    -------

rootnodeは単一ノードです。2 つの子はより一般的で、バイナリ ツリーを表します。子は、空、単一ノード、または完全に成長したバイナリ ツリーのいずれかです。

この表現は、あらゆる種類の空でない二分木を表現するのに十分一般的であることに同意しますか? たとえば、この単純なツリーを私の表現に分解できますか?

この概念を理解していれば、この分解は問題の解決に役立ちます。概念は理解できても、アルゴリズムについてこれ以上進めることができない場合は、ここにコメントしてください。もう少し具体的に説明します :)

于 2009-06-15T02:29:21.833 に答える
1

Tree Traversalのようなものを使用して、各値を確認できます。

于 2009-06-15T02:03:08.603 に答える
0

ツリーがバイナリサーチツリーである場合、事前注文ウォークによって信頼性の高い繰り返し可能なアイテムの注文が生成され、既存の回答が機能します。それらが任意のバイナリ ツリーである場合は、さらに興味深い問題があり、ハッシュ テーブルを調べる必要があります。

于 2009-06-15T02:05:59.907 に答える
0

2 つのツリーが同じツリー トラバーサル ロジックを通過し、出力が一致するようにします。1 つのノード データでも一致しない場合、ツリーは一致しません。

または、単純なツリー トラバーサル ロジックを作成し、各再帰でノード値を比較することもできます。

于 2012-08-16T19:11:45.283 に答える
0

私の解決策は、2 つのツリーを (レベル順を使用して) 2 つの配列にフラット化し、各項目を反復処理して比較することです。両方の配列が同じ順序であることがわかります。配列のサイズが異なり、2 つのツリーが同じでない場合など、簡単な事前チェックを行うことができます。

Level Order はかなり簡単に実装できます。ウィキペディアのツリー トラバーサルに関する記事では、コードを含め、基本的に必要なものはすべて提供されています。質問で効率が求められている場合は、非再帰的なソリューションが最適であり、FIFO リスト (C# 用語のキュー - 私は C プログラマーではありません) を使用して実行されます。

于 2009-06-15T14:56:34.417 に答える
0

ポインターと再帰を使用して、ノードが等しいかどうかを確認してから、サブツリーを確認できます。コードは Java 言語で次のように記述できます。

public boolean sameTree(Node root1, Node root2){
//base case :both are empty
if(root1==null && root2==null )
   return true;

if(root1.equals(root2)) {
    //subtrees
    boolean left=sameTree(root1.left,root2.left);
    boolean right=sameTree(root1.right,root2.right);
    return (left && right);
}//end if
else{
    return false;
}//end else

}//sameTree() を終了

于 2013-09-07T06:54:49.000 に答える