2019.10.24——树的子结构
作者:互联网
文章目录
题目描述
输入两棵二叉树A,B,判断B是不是A的子结构。(ps:我们约定空树不是任意一个树的子结构)
题目思路
这题相当于在集合A中找是否存在集合B,而这题又涉及到树的结构,一想到树,我们很容易想到递归算法,因为关于树的很多算法都采用的是递归的思想,那么这题我们能不能使用递归的想法呢?这里的话我们采取先序+递归的联合思想。首先,我们将A和B的根相比较,如果一致再比较左右子树,当然可能A,B的根并不相等,那么我们要把B的根与A的左右子树进行比较,找到一致的后,再将B的左右子树与A中一致的节点的左右子树进行比较。大致思路就是这样,下面可以看代码我再进行讲解。
代码
/*
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 flag=false; //判断是否找到
if(pRoot1&&pRoot2) //因为A为空或者B为空或者
//都为空都不可能存在子结构
{
if(pRoot1->val==pRoot2->val) //如果A的值与B的根相等,
//那么我们进行左右子树的判断
flag=isexist(pRoot1,pRoot2); //返回判断
if(!flag) //说明A的值与B的根值不等
flag=HasSubtree(pRoot1->left,pRoot2)
||HasSubtree(pRoot1->right,pRoot2);
//将A的左子树或者A的右子树与B进行判断是否为子结构,这里用或
}
return flag;
}
bool isexist(TreeNode* pRoot1, TreeNode* pRoot2)
{
if(pRoot1==NULL&&pRoot2!=NULL) //A为空B不为空说明假,
//这里要注意一点A为空,B为空的时候是真的,所以要加上B不为空
return false;
if(pRoot2==NULL) //如果B为空,说明全部B的节点A全部存在,为真
return true;
if(pRoot1->val==pRoot2->val) //如果A的值与B的值相等,
//递归下去进行判断
return isexist(pRoot1->left,pRoot2->left)
&&isexist(pRoot1->right,pRoot2->right);
//这里用并,因为要全部相等才能是子结构
else
return false;
}
};
标签:24,TreeNode,为空,val,pRoot2,子结构,pRoot1,2019.10 来源: https://blog.csdn.net/guta4327/article/details/102729970