判断一颗树是不是另一棵树的子结构

问题

输入两棵二叉树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);
    }

猜你喜欢

转载自blog.csdn.net/Runner1st/article/details/88762202
今日推荐