✍个人博客:https://blog.csdn.net/Newin2020?spm=1011.2415.3001.5343
📚专栏地址:剑指offer系列题解
📝原题地址:题目地址
📣专栏定位:为找工作的小伙伴整理常考算法题解,祝大家都能成功上岸!
❤️如果有收获的话,欢迎点赞👍收藏📁,您的支持就是我创作的最大动力💪
题目描述
输入两棵二叉树 A,B,判断 B 是不是 A 的子结构。
我们规定空树不是任何树的子结构。
数据范围
每棵树的节点数量 [0,1000]。
样例
树 A:
8 / \ 8 7 / \ 9 2 / \ 4 7
树 B:
8 / \ 9 2
返回 true,因为 B 是 A 的子结构。
方法一:二叉树,递归 O(nm)
这道题分成两个部分:
- 遍历
A
树所有结点。 - 遍历时,将
A
的结点下的子树和B
树递归进行比较。
我们拿题目的样例举例:
第一步: 从根结点开始,发现当前结点下的子树并不与 B
树匹配。
第二步: 递归到根结点的左子树,再判断该结点下的子树是否与 B
树匹配,发现包含 B
树,直接返回 true
即可。
/**
* Definition for a binary tree node.
* struct TreeNode {
* int val;
* TreeNode *left;
* 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;
//判断p1下的子树是否包含p2下的树
if (isSame(pRoot1, pRoot2)) return true;
//如果p1当前结点没有和p2匹配成功,再分别去p1的左右结点下的子树进行匹配
return hasSubtree(pRoot1->left, pRoot2) || hasSubtree(pRoot1->right, pRoot2);
}
//比较子树
bool isSame(TreeNode* pRoot1, TreeNode* pRoot2) {
if (!pRoot2) return true; //p2要比p1树小,所以可以以p2为结束标志
//p1要包含p2,所以p1不能提前为空,否则无法与p2继续匹配
if (!pRoot1 || pRoot1->val != pRoot2->val) return false;
//分别继续比较p1和p2的左子树及右子树是否匹配
return isSame(pRoot1->left, pRoot2->left) && isSame(pRoot1->right, pRoot2->right);
}
};
欢迎大家在评论区交流~