剑指offer之数的子结构

本文探讨了如何判断一棵二叉树是否为另一棵二叉树的子结构,通过递归算法实现,详细解析了代码逻辑与个人实现过程。

一、题目描述

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

二、代码及理解

子树的可能:
在这里插入图片描述
    判断是否是子树,当pRoot1和pRoot2一起递归遍历,pRoot2如果遍历结束说明就是子树,如果没有遍历结束,说明不是子树。

class Solution {
public:
    bool Equal(int num1, int num2)
    {
        if(num1 - num2 == 0)
            return true;
        return false;
    }
    
    bool DoesTree1HasTree2(TreeNode* Root1,TreeNode* Root2)
    {
        if(Root2 == nullptr) //Root2为空则,说明Root2已经遍历完全说明是子树
            return true;
        if(Root1 == nullptr) 
            return false;
        if(!Equal(Root1->val,Root2->val))
        {
            return false;   //如果两个节点的值不相同,result接收到false,然后,HasSubtree()开始递归下一个节点
        }
        return DoesTree1HasTree2(Root1->left,Root2->left) && DoesTree1HasTree2(Root1->right,Root2->right); //当两个树的节点都相同,分别递归左子树和右子树
    }
    
    bool HasSubtree(TreeNode* pRoot1, TreeNode* pRoot2)
    {
        bool result = false;
        if(pRoot1 != nullptr && pRoot2 != nullptr)
        {
            if(Equal(pRoot1->val,pRoot2->val))//判断当前节点的值是不是相等
            {
                result = DoesTree1HasTree2(pRoot1,pRoot2); //开始递归判断,包含返回true不包含返回false
            }
            if(!result) //初始值为false,!result为true
            {
                result = HasSubtree(pRoot1->left,pRoot2); //利用自身递归来寻找pRoot1左子树与pRoot2根节点相等的节点
            }
            if(!result)
            {
                result = HasSubtree(pRoot1->right,pRoot2);//利用自身递归来寻找pRoot1右子树与pRoot2根节点相等的节点
            }
        }
           return result;
    }
};

三、个人总结及感受

    二叉树模型,属于相对较复杂的数据结构,一开始做入手这道题并不是直接写代码,先画好满足题意的情况,然后,自己模拟场景,把每种情况遍历一遍,找到共同点,其次,把这些共同点分别对应的是一个条件,进行模拟实现,完成代码。

    我开始入手这道题时,对于我的难点是不知道如何把各个条件进行分级化,查阅了相关问题模型的处理方式,再进行程序的调试。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值