[剑指offer-26]树的子结构
2019-11-15 本文已影响0人
Coding破耳
题目描述
输入两棵二叉树A,B,判断B是不是A的子结构。(ps:我们约定空树不是任意一个树的子结构)
解法
首先,约定空树不是任意数的子结构,因此若B为空,则b不是a的子结构,不论a是否为空;
当b不为空时,若a为空,则b不是a的子结构。
当ab均不为空时,判断b是否为a的子结构步骤如下:
若a的根结点的值与b的根节点的值相等,判断b是否在a的结构中(方法IsBinA),若在则b为a的子结构;若不在,递归判断b是不是a的左树/右树的子结构。
写出伪代码如下:
bool IsBinA(a,b)
{
if(b 为空)
{
返回true;
}
if(a 为空)
{
返回false;
}
if(a的值与b的值相等)
{
return IsBinA(a->left,b->left) && IsBinA(a->right,b->right);
}
return false;
}
bool HasSubtree(a,b)
{
if(a 为空 || b 为空)
{
返回false;
}
//ab均不为空
bool result = false;
if(a的值与b的值相等)
{
判断b是不是a的子结构
result = IsBinA(a,b);
}
//b不是a的子结构
if(!result)
{
result = HasSubtree(a->left,b) || HasSubtree(a->right,b);
}
return result;
}
方法IsBinA,判断B是不是A的子结构:
1.若b为空,不论a是否为空,说明b是a的子结构,返回true
2.若a为空,因上面已经判断b为空的场景,故此时a为空时b不是a的子结构,返回false
3.若ab均不为空,且ab的根结点值相同,对ab的左右节点分别进行IsBinA判断
代码实现如下:
/*
struct TreeNode {
int val;
struct TreeNode *left;
struct TreeNode *right;
TreeNode(int x) :
val(x), left(NULL), right(NULL) {
}
};*/
class Solution {
public:
bool DoseSubTree(TreeNode* pRoot1, TreeNode* pRoot2)
{
if(pRoot2 == NULL)
{
return true;
}
if(pRoot1 == NULL)
{
return false;
}
if(pRoot1->val == pRoot2->val
&& DoseSubTree(pRoot1->left,pRoot2->left)
&& DoseSubTree(pRoot1->right,pRoot2->right))
{
return true;
}
return false;
}
bool HasSubtree(TreeNode* pRoot1, TreeNode* pRoot2)
{
if(pRoot1 == NULL || pRoot2 == NULL)
{
return false;
}
bool result = false;
if(!(pRoot1->val == pRoot2->val && DoseSubTree(pRoot1,pRoot2)))
{
return HasSubtree(pRoot1->left,pRoot2) || HasSubtree(pRoot1->right,pRoot2);
}
return true;
}
};