问题
输入两棵二叉树A,B,判断B是不是A的子结构。(ps:我们约定空树不是任意一个树的子结构)
思路及实现
首先要明确的一点是,子结构不是子树,子树是一个更强的条件,而子结构只是指树结构中有这一子部分,如下图,B不是A的子树,但却是A的子结构。
1 2
/ \ \
2 3 5
/ \ \
4 5 6
(A) (B)
所以思路就是,
(1) 先从A找到一个节点与B的根节点相同;
(2) 然后再比较B剩下的节点是否与A的一一对应。
可以用递归的方法实现,这第二步有点像判断两颗树是否相等,只不过这里只是子结构,不要求全部节点相同。
我们先实现第二步:
bool isSubtree(TreeNode* pRoot1, TreeNode* pRoot2){
// pRoot2到终点了,还没找到与pRoot1不一样的点,返回真
if(pRoot2 == NULL) return true;
// pRoot2还没到终点,pRoot1先到终点了,返回false
if(pRoot1 == NULL) return false;
if(pRoot1->val != pRoot2-> val) return false;
return isSubtree(pRoot1->left, pRoot2->left)
&& isSubtree(pRoot1->right, pRoot2->right);
}
第一步也可以用递归实现:
先从根节点调用isSubtree,若不成立,则判断其左子树和右子树。
bool HasSubtree(TreeNode* pRoot1, TreeNode* pRoot2)
{
if(pRoot2 == NULL || pRoot1 == NULL) return false;
return isSubtree(pRoot1, pRoot2)
|| HasSubtree(pRoot1->left, pRoot2)
|| HasSubtree(pRoot1->right, pRoot2);
}