1,题目要求
输入两棵二叉树A,B,判断B是不是A的子结构。(ps:我们约定空树不是任意一个树的子结构)
2,题目思路
对于这道题,要求判断一棵树B是否是另一颗树A的子树。
需要注意的是,这道题中定义空树不能使任何树的子树,也就是说明了B不能为空而且空树不能是空树的子树。
在判断上,算法分成两个部分:
- 对树A每个节点进行遍历判断;
- 比较两个从对应root出发的树的每个节点是否相等。
因此比较算法,我们可以单独递归实现,遍历树A,我们既可以使用递归,也可以使用非递归的思想。
3,代码实现
1,非递归
/*
struct TreeNode {
int val;
struct TreeNode *left;
struct TreeNode *right;
TreeNode(int x) :
val(x), left(NULL), right(NULL) {
}
};*/
class Solution {
public:
bool HasSubtree(TreeNode* pRoot1, TreeNode* pRoot2)
{
if(!pRoot1 || !pRoot2)
return false;
queue<TreeNode*> q;
q.push(pRoot1);
while(!q.empty()){
TreeNode* node = q.front();
q.pop();
if(isSame(node, pRoot2))
return true;
if(node->left)
q.push(node->left);
if(node->right)
q.push(node->right);
}
return false;
}
private:
bool isSame(TreeNode* s, TreeNode* t){
if(!t)
return true;
if(!s || s->val != t->val)
return false;
return isSame(s->left, t->left) && isSame(s->right, t->right);
}
};
2,递归
/*
struct TreeNode {
int val;
struct TreeNode *left;
struct TreeNode *right;
TreeNode(int x) :
val(x), left(NULL), right(NULL) {
}
};*/
class Solution {
public:
bool HasSubtree(TreeNode* pRoot1, TreeNode* pRoot2)
{
if(!pRoot1 || !pRoot2)
return false;
if(isSame(pRoot1, pRoot2))
return true;
return isSame(pRoot1->left, pRoot2) || isSame(pRoot1->right, pRoot2);
}
private:
bool isSame(TreeNode* s, TreeNode* t){
if(!t)
return true;
if(!s || s->val != t->val)
return false;
return isSame(s->left, t->left) && isSame(s->right, t->right);
}
};