剑指offer(C++)-JZ26:树的子结构(数据结构-树)

作者:翟天保Steven
版权声明:著作权归作者所有,商业转载请联系作者获得授权,非商业转载请注明出处

题目描述:

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

扫描二维码关注公众号,回复: 13715892 查看本文章

解题思路:

本题考察数据结构树的使用。先定义一个辅助函数check用来检查结构是否一致,如果p2结点为空返回true,p1结点为空则返回false,这是因为p1要包含p2,除了判断根节点的值是否一致,还要分别判断p1和p2的左子树和右子树;HasSubtree函数是该问题的主功能函数,判断树pRoot2是否在树pRoot1内,只有当根节点的值一致时,执行check函数,进行结构一致性的判断,若值不一致,再依次取pRoot1的左树和右树进行判断,直到遍历完pRoot1的所有结点,过程中如果找到pRoot2的结构,则flag置为true,完毕。

测试代码:

/*
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) {
        bool flag=false;
        if(pRoot1!=nullptr&&pRoot2!=nullptr)
        {
            if(pRoot1->val==pRoot2->val)
                flag=check(pRoot1,pRoot2);
            if(!flag)
                flag=HasSubtree(pRoot1->left,pRoot2);
            if(!flag)
                flag=HasSubtree(pRoot1->right,pRoot2);
        }
        return flag;
    }
    // 检查结构是否一致
    bool check(TreeNode *p1,TreeNode *p2){
        if(p2==nullptr)
            return true;
        if(p1==nullptr)
            return false;
        if(p1->val!=p2->val)
            return false;
        // 检查左子树和右子树是否均一致
        return check(p1->left,p2->left)&&check(p1->right,p2->right);
    }
};

猜你喜欢

转载自blog.csdn.net/zhaitianbao/article/details/122776524