题目
输入两棵二叉树A,B,判断B是不是A的子结构
思路:
相等函数:判断 二叉树1 是否完全包含 二叉树2,头结点相等(利用深度优先遍历,递归法)
主函数: 判断 二叉树1 每一个节点是否和 二叉树2 相等(利用相等函数)(广度优先遍历,队列)
bool Has_same(TreeNode *pRoot1, TreeNode *pRoot2) // 相等函数,1包含2
{
if (!pRoot2)
return true; // 深度优先算法,递归法
else if (!pRoot1 || pRoot1->val != pRoot2->val)
return false;
return Has_same(pRoot1->left, pRoot2->left) && Has_same(pRoot1->right, pRoot2->right);
}
bool HasSubtree(TreeNode *pRoot1, TreeNode *pRoot2)
{ // 主函数
if (!pRoot1 || !pRoot2)
return false;
deque<TreeNode *> deq; // 双向队列,单向队列也可以
TreeNode *pro = nullptr;
deq.push_back(pRoot1);
while (!deq.empty()) // 广度优先算法,可简化,此为更全写法
{
int time = deq.size();
for (int i = 0; i < time; i++)
{
pro = deq.front();
if (Has_same(pro, pRoot2))
return true; // 访问,处理
if (pro->left)
deq.push_back(pro->left); // 下一个
if (pro->right)
deq.push_back(pro->right);
deq.pop_front(); // 删除队首
}
// 下一行
}
return false;
}