一、题目描述
输入两棵二叉树A,B,判断B是不是A的子结构。(ps:我们约定空树不是任意一个树的子结构)
解题思路
- 以根节点做为出发点,比较两个二叉树的根节点是否相同,相同则比较左节点和右节点是否完全相同,相同可说明B是A的子结构
- 当两个二叉树的根节点不相同,则从A树的左子树开始找是否存在和B相等的子树;如果仍没找到,则从A树的右子树开始找是否存在和B相等的子树,最后输出寻找的结果
二、实现代码
/*
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)
{
bool res= false;
//如果两个二叉树中有一个为空,则返回false
if(pRoot1 ==NULL || pRoot2 == NULL){
return false;
}
//如果两个二叉树根节点的值相同,则比较这两个二叉树是否相同
if(pRoot1->val == pRoot2->val){
res = isSub(pRoot1,pRoot2);
}
//如果仍然不相同,则从A树pRoot1的左子树找pRoot2
if(!res){
res = HasSubtree(pRoot1->left,pRoot2);
}
//如果仍然不相同,则从A树pRoot1的右子树找pRoot2
if(!res){
res = HasSubtree(pRoot1->right,pRoot2);
}
return res;
}
bool isSub(TreeNode* pRoot1, TreeNode* pRoot2)
{
//需要先判断小二叉树pRoot2是否为空,为空则为true
if(pRoot2 == NULL)
//当小二叉树pRoot2不为空,则判断大二叉树pRoot1是否为空,为空则为false
if(pRoot1 == NULL)
return false;
//如果根节点对应上了,则对左右子树进行匹配
if(pRoot1->val == pRoot2->val)
return isSub(pRoot1->left , pRoot2->left) && isSub(pRoot1->right , pRoot2->right) ;
return false;
}
};