非递归层序遍历法
树的子结构
http://www.nowcoder.com/questionTerminal/6e196c44c7004d15b1610b9afca8bd88
class Solution {
public:
bool HasSubtree(TreeNode* pRoot1, TreeNode* pRoot2)
{
if(pRoot2 == nullptr || pRoot1 == nullptr)
{
return false;
}
queue<TreeNode*> que; //使用层序遍历
TreeNode *p1 = pRoot1;
int sum = 0;
que.push(p1);
while(!que.empty())
{
p1 = que.front();
que.pop();
if(p1->val == pRoot2->val) //所有相等的都有可能是起点
{
sum+=Subtree(p1, pRoot2);
}
if(p1->left != nullptr)
{
que.push(p1->left);
}
if(p1->right != nullptr)
{
que.push(p1->right);
}
}
return sum ? true : false;
}
int Subtree(TreeNode* pRoot1, TreeNode* pRoot2) //相同返回1
{
TreeNode *p1 = nullptr,*p2 = nullptr;
queue<TreeNode*> que1,que2;
que1.push(pRoot1);
que2.push(pRoot2);
while(!que1.empty() && !que2.empty())
{
p1 = que1.front();
p2 = que2.front();
if(p1->val != p2->val)
{
break;
}
que1.pop();
que2.pop();
if(p2->left != nullptr)
{
que2.push(p2->left);
if(p1->left != nullptr)
que1.push(p1->left);
}
if(p2->right != nullptr)
{
que2.push(p2->right);
if(p1->right != nullptr)
que1.push(p1->right);
}
}
return que2.empty() ? 1 : 0;
}
};