递归法
- 问题拆分成:已知头节点比较两颗树是否相同(递归函数一)+ 遍历树的节点作为比较起点(递归函数二)
- 注意空指针判断
/*
struct TreeNode {
int val;
struct TreeNode *left;
struct TreeNode *right;
TreeNode(int x) :
val(x), left(NULL), right(NULL) {
}
};*/
class Solution {
public:
bool isSame(TreeNode* pRoot1,TreeNode* pRoot2)
{
if(!pRoot1&&pRoot2)
{
return false;
}
//pRoot1!=nullptr
if(!pRoot2)
{
return true;
}
if(pRoot1->val!=pRoot2->val)
{
return false;
}
return isSame(pRoot1->left,pRoot2->left)&&isSame(pRoot1->right, pRoot2->right);
}
bool HasSubtree(TreeNode* pRoot1, TreeNode* pRoot2) {
if(!pRoot1||!pRoot2)
{
return false;
}
return isSame(pRoot1,pRoot2)||HasSubtree(pRoot1->left, pRoot2)||HasSubtree(pRoot1->right, pRoot2);
}
};
非递归法
- 重点:1.选择头节点 2从头节点开始比较
- 相比递归法,用bfs找头节点,再用bfs从头节点开始比较
- bfs比前中后序遍历可以避免子节点影响
/*
struct TreeNode {
int val;
struct TreeNode *left;
struct TreeNode *right;
TreeNode(int x) :
val(x), left(NULL), right(NULL) {
}
};*/
#include <queue>
class Solution {
public:
bool isSame(TreeNode* pRoot1,TreeNode* pRoot2)
{
queue<TreeNode*> q1;
queue<TreeNode*>q2;
q1.push(pRoot1);
q2.push(pRoot2);
while(q2.size())
{
if(q2.front())
{
if(!q1.front()||
q2.front()->val!=q1.front()->val)
{
return false;
}
q2.push(q2.front()->left);
q2.push(q2.front()->right);
q1.push(q1.front()->left);
q1.push(q1.front()->right);
}
q2.pop();
q1.pop();
}
return true;
}
bool HasSubtree(TreeNode* pRoot1, TreeNode* pRoot2) {
if(!pRoot1||!pRoot2)
{
return false;
}
queue<TreeNode* >q;
q.push(pRoot1);
while(q.size())
{
TreeNode* node=q.front();
if(node)
{
if(isSame(node,pRoot2))
{
return true;
}
q.push(node->left);
q.push(node->right);
}
q.pop();
}
return false;
}
};