题目描述
输入两棵二叉树A,B,判断B是不是A的子结构。
我们规定空树不是任何树的子结构。
样例描述
树A:
8
/ \
8 7
/ \
9 2
/ \
4 7
树B:
8
/ \
9 2
返回 true ,因为B是A的子结构。
/**
* 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;
if(isPart(pRoot1,pRoot2)) return true;
return hasSubtree(pRoot1->left,pRoot2)||hasSubtree(pRoot1->right,pRoot2);
}
bool isPart(TreeNode *p1,TreeNode *p2){
//子结构中第二颗树都到空了,所以肯定是子结构
if(!p2) return true;
//第一颗树空 第二棵树不空,或者 两棵都不空 但是值不相等
if((!p1&&p2)||p1->val!=p2->val) return false;
//左右子树都是前一颗树的部分 才是真的part
return isPart(p1->left,p2->left)&&isPart(p1->right,p2->right);
}
};