Recursion
typedef struct TreeNode {
int mValue;
TreeNode* mLeft;
TreeNode* mRight;
} TreeNode;
extern bool HasSubTreeCore(TreeNode* pTreeNode1, TreeNode* pTreeNode2);
bool DoseTree1HaveAllNodesOfTree2(TreeNode* pTreeNode1, TreeNode* pTreeNode2) {
if (pTreeNode2 == NULL) {
return true;
}
if (pTreeNode1 == NULL) {
return false;
}
if (pTreeNode1->mValue != pTreeNode2->mValue) {
return false;
}
return DoseTree1HaveAllNodesOfTree2(pTreeNode1->mLeft, pTreeNode2->mLeft) &&
DoseTree1HaveAllNodesOfTree2(pTreeNode1->mRight, pTreeNode2->mRight);
}
bool HasSubTree(TreeNode* pTreeHead1, TreeNode* pTreeHead2) {
if ((pTreeHead1 == NULL && pTreeHead2 != NULL) ||
(pTreeHead1 != NULL && pTreeHead2 == NULL)) {
return false;
}
if (pTreeHead1 == NULL && pTreeHead2 == NULL) {
return true;
}
return HasSubTreeCore(pTreeHead1, pTreeHead2);
}
bool HasSubTreeCore(TreeNode* pTreeNode1, TreeNode* pTreeNode2) {
bool result = false;
if (pTreeNode1->mValue == pTreeNode2->mValue) {
result = DoseTree1HaveAllNodesOfTree2(pTreeNode1, pTreeNode2);
}
if (!result && pTreeNode1->mLeft != NULL) {
result = HasSubTreeCore(pTreeNode1->mLeft, pTreeNode2);
}
if (!result && pTreeNode1->mRight != NULL) {
result = HasSubTreeCore(pTreeNode1->mRight, pTreeNode2);
}
return result;
}
int main() {
/* Build Tree 1 */
TreeNode* root1 = new TreeNode();
root1->mValue = 1;
TreeNode* tn11 = new TreeNode();
tn11->mValue = 8;
TreeNode* tn12 = new TreeNode();
tn12->mValue = 7;
TreeNode* tn13 = new TreeNode();
tn13->mValue = 9;
TreeNode* tn14 = new TreeNode();
tn14->mValue = 2;
TreeNode* tn15 = new TreeNode();
tn15->mValue = 4;
TreeNode* tn16 = new TreeNode();
tn16->mValue = 7;
root1->mLeft = tn11;
root1->mRight = tn12;
tn11->mLeft = tn13;
tn11->mRight = tn14;
tn14->mLeft = tn15;
tn14->mRight = tn16;
/* Build Tree 2 */
TreeNode* root2 = new TreeNode();
root2->mValue = 8;
TreeNode* tn21 = new TreeNode();
tn21->mValue = 9;
TreeNode* tn22 = new TreeNode();
tn22->mValue = 2;
/* Abnormal Node */
TreeNode* tn23 = new TreeNode();
tn23->mValue = 3;
root2->mLeft = tn21;
root2->mRight = tn22;
/* Abnormal SubTreeNode */
tn22->mRight = tn23;
bool res = false;
res = HasSubTree(root1, root2);
printf("%s", res ? "True" : "False");
return 0;
}
Iteration
e…..
Refs: http://zhedahht.blog.163.com/blog/static/25411174201011445550396/
近期评论