题目描述
输入两棵二叉树A,B,判断B是不是A的子结构。
我们规定空树不是任何树的子结构。
样例
树A:
8
/ \
8 7
/ \
9 2
/ \
4 7
树B:
8
/ \
9 2
返回 true ,因为B是A的子结构。
问题分析
先判断两个根节点,如果它们中存在空节点,那么返回false。接下来用isSub函数判断B树是否是A树从根节点开始的子树。如果是那么返回true,否则分别用A树根节点的左孩子和右孩子调用递归函数hasSubtree,如果有返回true的,那么就返回true。在isSub函数中:如果B树根节点为空,那么返回true;接下来判断如果A树根节点为空或者A树根节点和B树根节点的值不相等,那么返回false;上面的条件都不满足说明A树根节点与B树根节点相等,那么我们接下来分别用A树的左孩子和B树的左孩子调用递归函数isSub,用A树的右孩子和B树的右孩子调用递归函数isSub,如果二者都返回true那么返回true,否则返回false。
代码实现
/**
* 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(isSub(pRoot1, pRoot2))
return true;
return hasSubtree(pRoot1->left, pRoot2) || hasSubtree(pRoot1->right, pRoot2);
}
bool isSub(TreeNode* pRoot1, TreeNode* pRoot2){
if(!pRoot2)
return true;
if(!pRoot1 || pRoot1->val != pRoot2->val)
return false;
return isSub(pRoot1->left, pRoot2->left) && isSub(pRoot1->right, pRoot2->right);
}
};