牛客网《剑指Offer》编程 17.树的子结构

题目描述

输入两棵二叉树A,B,判断B是不是A的子结构。(ps:我们约定空树不是任意一个树的子结构)。

解题思路

判断一棵树是不是另一棵树的子结构,并不是判断是不是另一棵树的子树。pRoot1树是原树,pRoot2树是待判断的树。在这里我们可以分两步进行。

外层函数实现:首先在pRoot1树中找到和pRoot2树根节点值相同的子树。

内层函数实现:在找到与pRoot2根节点值相同的子树之后,判断pRoot2是不是pRoot1的子结构。方法如下:

                          如果pRoot2为空树,则是;//题目中已经说了空树不是子结构,空树其实已经在外函数中被过滤掉了。在这里判断为是是因为此时已经判断出pRoot2不为空,有根节点,这里判断的其实是pRoot2的子树。也就是说当pRoot2子树为空的时候,pRoot2还是可能成为pRoot1的子结构的。

                          如果pRoot2不为空,但pRoot1为空,则不是子结构。

                          如果pRoot2的值不等于pRoot1的值,则不是子结构。

                          如果值相等,则继续判断左子树和右子树的情况。

代码实现

/*
struct TreeNode {
	int val;
	struct TreeNode *left;
	struct TreeNode *right;
	TreeNode(int x) :
			val(x), left(NULL), right(NULL) {
	}
};*/
class Solution {
public:
    bool DoesTree1HasTree2(TreeNode* pRoot1, TreeNode* pRoot2)
	{
		if(!pRoot2){return true;}
        if(!pRoot1&&pRoot2){return false;}
        if(pRoot1->val!=pRoot2->val){return false;}
        return DoesTree1HasTree2(pRoot1->left,pRoot2->left)&&DoesTree1HasTree2(pRoot1->right,pRoot2->right);

	}
    bool HasSubtree(TreeNode* pRoot1, TreeNode* pRoot2)
    {
        bool result = false;
		if (pRoot1 &&pRoot2 )
		{
			if (pRoot1->val == pRoot2->val) {
				//继续判断树1是否有树2;
				result = DoesTree1HasTree2(pRoot1, pRoot2);
			}
			if(!result){
                result=HasSubtree(pRoot1->left,pRoot2);
            }
            if(!result){
                result=HasSubtree(pRoot1->right,pRoot2);
            }
		}
		return result;
    }
};

猜你喜欢

转载自blog.csdn.net/eriHanami/article/details/82767017