bool IsSubtree(BinaryTreeNode* pRoot1, BinaryTreeNode* pRoot2) {
if (pRoot1 == NULL || pRoot2 == NULL) {
return false;
}
stack<BinaryTreeNode*> stk;
stk.push(pRoot1);
while (!stk.empty()) {
BinaryTreeNode *tmp = stk.top();
stk.pop();
if (tmp->m_nValue == pRoot2->m_nValue) {
stack<BinaryTreeNode*> first;
BinaryTreeNode *f;
stack<BinaryTreeNode*> second;
BinaryTreeNode *s;
first.push(tmp);
second.push(pRoot2);
bool find = true;
while (!first.empty()) {
f = first.top();
first.pop();
s = second.top();
second.pop();
if (f->m_nValue != s->m_nValue) {
find = false;
break;
}
if (s->m_pLeft != NULL) {
if (f->m_pLeft == NULL) {
find = false;
break;
} else {
first.push(f->m_pLeft);
second.push(s->m_pLeft);
}
}
if (s->m_pRight != NULL) {
if (f->m_pRight == NULL) {
find = false;
break;
} else {
first.push(f->m_pRight);
second.push(s->m_pRight);
}
}
}
if (find == true && first.empty()) {
return true;
}
}
if (tmp->m_pLeft != NULL) {
stk.push(tmp->m_pLeft);
}
if (tmp->m_pRight != NULL) {
stk.push(tmp->m_pRight);
}
}
return false;
}