题目描述
输入两棵二叉树A,B,判断B是不是A的子结构。(ps:我们约定空树不是任意一个树的子结构)
- 自己最初因为对子结构的概念不清,误认为是包含叶子节点的一部分,从而导致条件判断时写成 p1 == NULL && p2 == NULL,实际子结构可以为任意部分
- 本题的本质还是DFS,只是它有两层,外层的DFS为对A进行DFS,每向下扫描一个点都作为一个新的起点根节点,来和B从头进行对比,内层DFS,以对当前A的扫描节点开始,对B一起从头开始DFS,判断是否每个节点的值一致;
- 一致即 p2 == NULL,返回true ,不一致便退出当前DFS,回到A的DFS过程中,扫描下一个节点继续开始
/*
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 == NULL || pRoot2 == NULL)
{
return false;
}
return isSubTree( pRoot1, pRoot2) || HasSubtree( pRoot1->left, pRoot2) || HasSubtree(pRoot1->right, pRoot2);
}
bool isSubTree( TreeNode *p1, TreeNode *p2)
{
if( p2 == NULL)
{
return true;
}
if( p1 == NULL )
{
return false;
}
if( p1->val != p2->val )
{
return false;
}
return isSubTree( p1->left, p2->left) && isSubTree( p1->right, p2->right);
}
};