题目描述
描述:输入两棵二叉树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
输入:{1,2,3,4,5},{2,4}
返回值:true
输入:{1,2,3},{3,1}
返回值:false
解题思路
树的子结构:最直观的想法是,使用双指针,一个指针指向A,一个指针指向B,首先遍历树A,然后针对树A的当前结点,判断B是否是以当前结点为根的子树的子结构。
//判断B是否是和以A为根的子树匹配
bool isSame(TreeNode *pRoot1,TreeNode *pRoot2)
{
//递归出口是如果pRoot2为空则为真
if(!pRoot2)
return true;
//反之如果pRoot2不为空但是pRoot1为空则为假
else if(!pRoot1)
return false;
//B和以A为根的子树匹配所需要满足的条件即为:B和A当前节点相等且B的左与A的左匹配且B的右和A的右匹配
return pRoot1->val==pRoot2->val&&isSame(pRoot1->left,pRoot2->left)&&isSame(pRoot1->right,pRoot2->right);
}
//判断树B是否是树A的子结构 其中是B是整个树A的子结构 并不一定是以A为根节点的 即A的根节点与B的根节点相等的匹配
bool HasSubtree(TreeNode* pRoot1, TreeNode* pRoot2)
{
//递归出口即为A或者B为空树则为false
if(!pRoot1||!pRoot2)
return false;
//B是A的子结构所需要满足的条件即为:B是以A为根节点的子树或者B是A的左孩子树的子结构或者B是A的右孩子的子结构
return isSame(pRoot1,pRoot2)||HasSubtree(pRoot1->left,pRoot2)||HasSubtree(pRoot1->right,pRoot2);
}