牛客网剑指Offer——树的子结构

题目描述

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


解题思路

要查找树A中是否存在和树B结构一样的子树,我们可以分成两步:
  Step1:在树A中找到和B的根结点的值一样的结点R;
  Step2:判断树A中以R为根结点的子树是不是包含和树B一样的结构。

当在树A中找到与B的根节点的值相同的节点R,则跳到step2判断树A中以R为根结点的子树是不是包含和树B一样的结构,如果相同的话,则树A中存在于树B结构相同的子树;如果不相同的话,返回step1,继续遍历R的子树,寻找下一个和B的根结点的值一样的结点。

1、在树A中找到和B的根结点的值一样的结点R

需要利用递归的思想,首先判断当前节点与B的根节点值是否相同,如果相同,则进入step2;如果不同,则分别判断当前节点的左子树、右子树与B的根节点值是否相同。

2、判断树A中以R为根结点的子树是不是包含和树B一样的结构

如果R节点的值和树B中的节点的值不同,则不是子结构;如果相同,递归去判断他们的各自的左孩子和右孩子是否相同。

递归的终止条件是到达了树A或者树B的叶子节点。

代码

/*
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)
    {
        if( pRoot2 == NULL || pRoot1 == NULL )
            return false;

        if( pRoot1->val == pRoot2->val )
            if( isSame(pRoot1,pRoot2) )
                return true;
        if ( HasSubtree(pRoot1->left,pRoot2) )
            return true;
        if ( HasSubtree(pRoot1->right,pRoot2) )
            return true;

        return false;
    }

    bool isSame(TreeNode* pRoot1, TreeNode* pRoot2)
    {
        if( pRoot2 == NULL )
            return true;
        if( pRoot1 == NULL )
            return false;
        if( pRoot1->val != pRoot2->val )
            return false;

        return isSame( pRoot1->left,pRoot2->left ) && isSame(pRoot1->right, pRoot2->right);
    }
};

猜你喜欢

转载自blog.csdn.net/qq_36132127/article/details/80183569