タイトル説明
二つのバイナリ入力A、Bは、BはAさんを下部ではないと判断されます。(詩:私たちは、空のツリーは任意のサブ構造ツリーではありません同意しました)
問題解決のためのアイデア
Bは、子ノードとルートノードBが同じであると、これはノードBツリーをルートとするサブツリーとなり、比較が満足のルックアップで、サブツリー、直感的なアプローチを任意の順序でツリーをトラバースないことを確認成功し、そうでない場合は、ルックアップは失敗します。最も直感的なのツリー先行順走査は、ここで前順に、例えば、C ++実装コードを示します:
/ * 構造体のTreeNode { ヴァルをint型、 ツリーノード構造体*左、 ツリーノード構造体*右; ツリーノード(INT X): 右(NULL){(NULL)左ヴァル(X)、 } }; * / クラスソリューション{ パブリック: BOOL HasSubtree(* pRoot1ツリーノード、ツリーノード* pRoot2) { BOOL isSub = 偽; //は、任意の二つのツリーが空で表示され、falseを返す IF(pRoot1 pRoot2 = = NULL &&!NULL){ IF(pRoot1->ヴァルをpRoot2- ==> ヴァル){ isSub =doesTree1HaveTree2(pRoot1、pRoot2)。 } もし(!isSub){ isSub = HasSubtree(pRoot1-> 左、pRoot2)。 } もし(!isSub){ isSub = HasSubtree(pRoot1-> 右、pRoot2)。 } } 戻りisSubと、 } BOOL doesTree1HaveTree2(ツリーノード* pRoot1、ツリーノード* pRoot2){ 場合(pRoot2 == NULL)は{ 返す 真。 } であれば(pRoot1 == NULL){ リターン 偽; } もし(!pRoot1->ヴァル= pRoot2-> ヴァル){ 戻り 偽。 } を返す(左pRoot1->左、pRoot2->)doesTree1HaveTree2 && doesTree1HaveTree2(pRoot1->右、pRoot2-> 右)。 } }。