/ * タイトル: 入力2つのバイナリAとB、Bはないサブツリーに決定されます。 * / / * アイデア: 1、フロートの大きさが決定されることに注意してください。 図2に示すように、ツリー決意ツリーAとBのルートノードが同じであれば、 同一の場合は、ノードAにルートノードはツリーのBを含有するように、それを判断し、 含まれていない場合は、Bを含む左サブツリーAツリーか否かが判断されます; 決定右サブツリーを含むツリーは、Bが含まれる場合 3、ノードAがルートで、ルートノードは、対応するBか否かを判断し、 平等はAとBのサブツリー左サブツリーを左決定し、決意平等右サブツリー右サブツリーとBを。 * / の#include <iostreamの> する#include <cstdlib> 名前空間STDを使用して、 ツリーノード{ストラクト ヴァルINTを、 *左ツリーノードをストラクト、 ツリーノードをストラクト*右; ツリーノード(INT X): 左のVal(X)、(NULL)を、右( NULL){ } }; BOOL等号(ダブルNUM1、ダブルNUM2){ IF(NUM1、NUM2> -0.0000001 && NUM1、NUM2 <0.0000001){ trueを返します。 } falseを返します。 } doesHasSubtree(ツリーノード* pNode1、ツリーノード* pNode2)BOOL { (pNode2 == nullptr)がtrueを返す場合。 (pNode1 == nullptr)戻り場合はfalse; IF(等号(pNode1->ヴァル、pNode2->ヴァル)){ リターンdoesHasSubtree(pNode1->左、pNode2->左)&& doesHasSubtree(pNode1->右、pNode2->右)。 } falseを返します。 } BOOL HasSubtree(ツリーノード* pRoot1、ツリーノード* pRoot2) { BOOL結果= FALSE; (pRoot1!= nullptr && pRoot2!= nullptr){もし あれば(等号(pRoot1->ヴァル、pRoot2->ヴァル)){ RESULT = doesHasSubtree(pRoot1、pRoot2)。 } もし{(結果!) 結果= HasSubtree(pRoot1->左、pRoot2)。 } もし{(結果!) 結果= HasSubtree(pRoot1->右、pRoot2)。 } } 結果を返します。 } int型のmain() { ツリーノード* node7 =新しいツリーノード(7)。 ツリーノード* node6 =新しいのTreeNode(4); ツリーノード* NODE5 =新しいのTreeNode(3); ツリーノード*ノード4 =新しいのTreeNode(9)。 ツリーノード*ノード3 =新しいのTreeNode(7); ツリーノード*ノード2 =新しいのTreeNode(8); ツリーノード*ノード1 =新しいのTreeNode(8); node1->左=ノード2。 node1->右=ノード3。 node2->左=ノード4。 node2->右= NODE5。 node5->左= node6。 node5->右= node7。 ツリーノード* node31 =新しいのTreeNode(2); ツリーノード* NODE21 =新しいのTreeNode(9)。 ツリーノード* NODE11 =新しいのTreeNode(8); node11->左= NODE21。 node11->右= node31。 COUT << HasSubtree(ノード1、NODE11)<< ENDL。 0を返します。 }