作者:翟天保Steven
版权声明:著作权归作者所有,商业转载请联系作者获得授权,非商业转载请注明出处
题目描述:
输入两棵二叉树A,B,判断B是不是A的子结构。(我们约定空树不是任意一个树的子结构)
假如给定A为{8,8,7,9,2,#,#,#,#,4,7},B为{8,9,2},2个树的结构如下,可以看出B是A的子结构
数据范围:
0 <= A的节点个数 <= 10000
0 <= B的节点个数 <= 10000
示例:
输入:
{8,8,7,9,2,#,#,#,#,4,7},{8,9,2}
返回值:
true
解题思路:
本题考察数据结构树的使用。先定义一个辅助函数check用来检查结构是否一致,如果p2结点为空返回true,p1结点为空则返回false,这是因为p1要包含p2,除了判断根节点的值是否一致,还要分别判断p1和p2的左子树和右子树;HasSubtree函数是该问题的主功能函数,判断树pRoot2是否在树pRoot1内,只有当根节点的值一致时,执行check函数,进行结构一致性的判断,若值不一致,再依次取pRoot1的左树和右树进行判断,直到遍历完pRoot1的所有结点,过程中如果找到pRoot2的结构,则flag置为true,完毕。
测试代码:
/*
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!=nullptr&&pRoot2!=nullptr)
{
if(pRoot1->val==pRoot2->val)
flag=check(pRoot1,pRoot2);
if(!flag)
flag=HasSubtree(pRoot1->left,pRoot2);
if(!flag)
flag=HasSubtree(pRoot1->right,pRoot2);
}
return flag;
}
// 检查结构是否一致
bool check(TreeNode *p1,TreeNode *p2){
if(p2==nullptr)
return true;
if(p1==nullptr)
return false;
if(p1->val!=p2->val)
return false;
// 检查左子树和右子树是否均一致
return check(p1->left,p2->left)&&check(p1->right,p2->right);
}
};