输入两棵二叉树A,B,判断B是不是A的子结构。(我们约定空树不是任意一个树的子结构)
假如给定A为{8,8,7,9,2,#,#,#,#,4,7},B为{8,9,2},2个树的结构如下,可以看出B是A的子结构
解题思路
判断B是否是A树的子结构,先确定比较的起始位置(根结点的值相等),判断其左右子树是否也相等。如果返回false,在左右子树中继续递过查找。
/*
struct TreeNode {
int val;
struct TreeNode *left;
struct TreeNode *right;
TreeNode(int x) :
val(x), left(NULL), right(NULL) {
}
};*/
class Solution {
bool IsSame(TreeNode* pRoot1, TreeNode* pRoot2)
{
if(pRoot2 == nullptr)
return true;
if(pRoot1 == nullptr) // pRoot2 != nullptr
return false;
if(pRoot1->val != pRoot2->val)
return false;
return IsSame(pRoot1->left, pRoot2->left) && IsSame(pRoot1->right, pRoot2->right);
}
public:
bool HasSubtree(TreeNode* pRoot1, TreeNode* pRoot2) {
if(pRoot1 == nullptr || pRoot2 == nullptr)
return false;
bool ret = false;
if(pRoot1->val == pRoot2->val)
{
// 从根结点入手,如果根结点相同,判定左右子树是否相等
ret = IsSame(pRoot1, pRoot2);
}
if(ret == false)
{
// 在左子树中继续找
ret = HasSubtree(pRoot1->left, pRoot2);
}
if(ret == false)
{
// 在右子树中继续找
ret = HasSubtree(pRoot1->right, pRoot2);
}
return ret;
}
};