2009-06-15 13 views
1

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

どのようにこの問題を解決するためのアイデアですか?

答えて

7

あなたは、並行したツリー走査を行います - あなたの注文(先行予約、後予約、順不同)を選択します。現在のノードに格納されている値がいつでも変わる場合は、2つのツリーも同じです。 1つの左のノードがヌルであり、もう1つのノードがヌルでない場合、ツリーは異なります。右ノードの場合は同上。

+1

さらなる条件がまだ適用されていない限り、同じ項目を持つ2つのバイナリ検索ツリーは、順序通りの歩行(ルート2、左1、対1、右2)で異なることができます。だから私はあなたの答えを編集して、(間違った条件のネットを示唆しないで)インオーダーの使用を避けることをお勧めします。 –

+0

質問は、情報の内容が同等かどうかではなく、値が各ツリーの対応するノードで同じかどうかについてです。あなたは、私が信じている質問とは異なる質問に答えることを試みていると信じています。 –

+0

私はすべてのノード(本質的にセットを形成する)の要素が等価であるかどうかチェックします。これは、対応するノードがすべて対応するノード内の要素が等しいかどうかをチェックすることとは対照的です。質問は、すべてで* NOT *で尋ねられたので、私は質問されなかった質問に答えるものではありません。 –

0

木がバイナリの場合は、検索ツリーです。そのため、事前予約の散歩では、信頼性の高い繰り返し可能なアイテムの順序が生成されるため、既存の回答が機能します。それらが任意のバイナリツリーであれば、はるかに興味深い問題があり、hash tablesを調べる必要があります。

+0

これをバイナリ検索ツリーに追加するには、ツリー内の最小値と最大値である左端の葉と右端の葉をチェックすれば十分です。 –

+0

...その間のすべての値もまったく同じです@cma ...? –

+0

@Alex - 任意のツリーの情報コンテンツが同等かどうかという質問があった場合、それ以上の作業が必要になります。質問はそのようなものではないようです。あなたはそれを過度に複雑にしています。 –

2

ノードの順序は重要ですか?私は次の二つの木、この答えを想定しています:ノード位置及び順序は、比較のために考慮されているので

1  1 
/\ /\ 
3 2 2 3 

は、等しくありません。

いくつかのヒント

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

もう少し正確なので

この一般的なツリーを考えてみましょう:

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

ルートノードは、単一のノードです。 2人の子供はより一般的で、バイナリツリーを表します。子ノードは空でも、単一のノードでも、完全に拡張されたバイナリツリーでもかまいません。

この表現は、空でないバイナリツリーを表すのに十分な汎用性があることに同意しますか?あなたは、私の表現にthis simple treeを分解することができますか?

この概念を理解すれば、この分解は問題の解決に役立ちます。あなたがコンセプトを理解しているが、アルゴリズムでそれ以上のことはできないなら、ここでコメントしてください。もう少し具体的になるでしょう:)

+0

@ NicDumZ、指定されているように、すべての要素が等しいかどうかを確認しています。非常に一般的な@Jonathanへの私のコメントを参照してください(それが編集されるまでは間違っています;-)同じ要素を持つ2つのバイナリ検索ツリーが異なる構造を持つ(他の制約を掛けて)答えます。 (また、私の答えを参照してください:バイナリ検索ツリーはバイナリツリーと同じではありません!) –

+0

@Alex - あなたは質問されたものとは別の質問に答えようとしています。 NicDumZは上の質問でうまくやっています。 –

+0

@Alex、私は知っています。私はこれを反映するために私の答えを紹介しました;)これは初心者の質問であり、OPはこれを正確にやりたがっていると信じています。バイナリ検索ツリーについては、質問のどこにでも「検索」が表示されません。 :) – NicDumZ

0

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

レベルオーダーは非常に簡単です。tree traversalのウィキペディアの記事では、基本的にコードを含め、必要なものすべてを提供しています。問題で効率が求められる場合は、非再帰的な解決策が最適であり、FIFOリスト(C#の用語でキュー - 私はCプログラマではない)を使用して実行するのが最適です。

0

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

単純なツリートラバーサルロジックを作成して、各再帰でノード値を比較するだけです。

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 

} //タグが質問に言及したようにCコードを書く端sameTree()

0

int is_same(node* T1,node* T2) 
{ 
    if(!T1 && !T2) 
    return 1; 
    if(!T1 || !T2) 
    return 0; 

    if(T1->data == T2->data) 
    { 
     int left = is_same(T1->left,T2->left); 
     int right = is_same(T1->right,T2->right); 
     return (left && right); 
    } 
    else 
    return 0; 
} 

構造体も値も考慮します。

0

2つのバイナリツリーノードが等しい(同じ値と同じ構造)かどうかを確認するには、1行のコードで十分です。

bool isEqual(BinaryTreeNode *a, BinaryTreeNode *b) 
{ 
    return (a && b) ? (a->m_nValue==b->m_nValue && isEqual(a->m_pLeft,b->m_pLeft) && isEqual(a->m_pRight,b->m_pRight)) : (a == b); 
} 
関連する問題