[26]树的子结构
1.题目
输入两颗二叉树 A 和 B ,判断 B 是不是 A 的子结构。
树A:
8 / \ 8 7 / \ 9 2 / \ 4 7
树B:
8 / \ 9 2
返回
true
,因为B是A的子结构
2.分析
- 空树不是任何树的子结构
3.思路
- 遍历A中所有非空节点 R
- 判读树 A 中以 R 为根节点的子树是不是包括和树 B一样的结构,且我们从根节点开始匹配
- 对于第一部分,我们直接递归遍历树 A 即可,遇到非空节点后,就直接进行第二部分
- 对于第二部分,我同时从根节点开始遍历两颗子树
- 如果树 B 中节点为空,则表示当前分支是匹配的,返回 true
- 如果树 A 中节点为空,但树B中的节点不为空,则说明不匹配
- 如果两个节点都不为空,但数值不同,则说明不匹配,返回 false
- 否则说明当前这个点是匹配的,然后递归判断左子树和右子树是否分别匹配即可
4.代码
class Solution {
public:
bool HasSubtree(TreeNode* pRoot1, TreeNode* pRoot2)
{
if(pRoot1==NULL || pRoot2==NULL) return false;
if(IsSubtree(pRoot1,pRoot2))
return true;
// 递归的遍历二叉树、先递归左边、再递归右边
return HasSubtree(pRoot1->left,pRoot2) || HasSubtree(pRoot1->right,pRoot2);
}
bool IsSubtree(TreeNode* pRoot1, TreeNode* pRoot2)
{
if(pRoot2==NULL) return true; // 子树遍历完
if(pRoot1==NULL) return false; // 不满足,返回false
if(pRoot1->val == pRoot2->val)
return IsSubtree(pRoot1->left,pRoot2->left) && IsSubtree(pRoot1->right,pRoot2->right);
return false; // 如果不相等
}
};