安全下部面の質問26-ツリーを証明オファー - バイナリ

/ * 
タイトル:
	入力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を返します。
}

   

おすすめ

転載: www.cnblogs.com/buaaZhhx/p/11918956.html