当前位置:首页 > 牛客 > 牛客3732题解:递归分治判断二叉树子树关系

牛客3732题解:递归分治判断二叉树子树关系

7个月前 (08-07)

牛客3732题解:递归分治判断二叉树子树关系 牛客题解 二叉树 递归 分治算法 树结构 C++ 第1张

一、题目解读

牛客3732题要求判断二叉树A是否包含二叉B作为子树。即是否存在A的某子树与B结构完全相同(节点值、左右子树关系均匹配)。问题核心在于高效搜索A的所有子树并与B进行比对,需避免重复遍历。

二、解题思路

核心思想为:

1. 递归分治:将大问题拆解为小问题,分别判断A的根节点是否等于B的根节点,若相等则递归检查左右子树;

2. 子树匹配:设计isSame函数判断两树是否完全相同,通过递归遍历左右子树并比对节点值;

3. 三种可能性:若A的根节点匹配B,或A的左/右子树包含B,则返回true。

三、解题步骤

1. 主函数HasSubtree:

    输入校验:若A或B为空,直接返回false;

    递归判断三种情况:

        以A为根节点的子树是否与B相同(调用isSame);

        A的左子树是否包含B;

        A的右子树是否包含B。

2. 辅助函数isSame:

    若B为空,说明B已匹配完成,返回true;

    若A为空但B不空,匹配失败;

    若节点值不相等,失败;

    递归检查A的左右子树是否与B的左右子树匹配。

四、代码与注释

class Solution {
private:
    bool isSame(TreeNode* A, TreeNode* B) {
        // B为空表示B树已经匹配完成
        if (B == nullptr) return true;
        // A为空但B不为空,匹配失败
        if (A == nullptr) return false;
        // 当前节点值不相等,匹配失败
        if (A->val!= B->val) return false;
        // 递归检查左右子树
        return isSame(A->left, B->left) && isSame(A->right, B->right);
    }
public:
    bool HasSubtree(TreeNode* pRoot1, TreeNode* pRoot2) {
        if (pRoot1 == nullptr || pRoot2 == nullptr) return false;
        // 三种情况满足一种即可:
        // 1. 以pRoot1为根节点的子树包含pRoot2
        // 2. pRoot2在pRoot1的左子树中
        // 3. pRoot2在右子树中
        return isSame(pRoot1, pRoot2) || HasSubtree(pRoot1->left, pRoot2) ||
               HasSubtree(pRoot1->right, pRoot2);
    }
};

五、总结

本解法通过递归分治将子树匹配问题分解为局部节点比对,时间复杂度O(nm)(n、m为两树节点数),空间复杂度O(n+m)(递归)。关键在于设计清晰的递归逻辑与边界条件,适用于需要判断树包含关系的场景,体现了递归算法的优雅与高效。


原创内容 转载请注明出处

分享给朋友:

相关文章

力扣198.打家劫舍|动态规划解法中的特殊边界处理

力扣198.打家劫舍|动态规划解法中的特殊边界处理

题意解析:在排列成直线的房屋群中,每个房屋藏有价值不同的财物。小偷不能连续抢劫相邻的两间房屋,否则会触发警报。我们需要设计一套抢劫策略,使得在不触发警报的前提下,能够获取的最大财物总和。这个问题本质上...

力扣119题:从O(n²)到O(2n):杨辉三角高效空间优化

力扣119题:从O(n²)到O(2n):杨辉三角高效空间优化

题目重解:给定一个非负索引 rowIndex,返回杨辉三角的第 rowIndex 行。不同于生成整个杨辉三角,这道题要求我们只返回特定行,且空间复杂度应尽可能优化。例如输入3,需要返回[1,3,3,1...

征服力扣704题:三步掌握经典二分查找算法

征服力扣704题:三步掌握经典二分查找算法

题目重解我们面对的是算法领域最经典的二分查找问题:在一个已排序的整数数组中,快速定位目标值的位置。就像在一本按字母顺序排列的字典中查找单词,我们不需要逐页翻阅,而是通过不断折半的方式快速缩小搜索范围,...

手搓顺序表类代码注释与详解:从零实现动态数组(新手教程)

一、简介和特点顺序表(Sequential List)是数据结构中基础的一种线性表,其特点是将数据元素存储在连续的内存空间中。通过数组实现,支持随机访问(即通过索引直接访问元素),适用于频繁随机读取的...

标题:洛谷B3617题解析:八进制转十六进制算法实现与优化(附AC100代码)

标题:洛谷B3617题解析:八进制转十六进制算法实现与优化(附AC100代码)

一、题目解读洛谷B3617题要求将输入的八进制字符串转换为十六进制表示。题目需处理大数场景,且对输入合法性有明确限制(长度不超过1000,仅包含0-7字符)。由于八进制与十六进制无法直接转换,需借助十...

【洛谷1184题解析】用C++高效解决地点匹配问题(附代码与解题思路)

【洛谷1184题解析】用C++高效解决地点匹配问题(附代码与解题思路)

一、题目解读洛谷1184题要求处理一组地点列表与行程记录,统计其中匹配的天数。题目难点在于高效处理带有空格的字符串输入,以及快速判断每日行程是否在高手可去地点集合中。需要兼顾输入格式解析与算法效率。二...

发表评论

访客

看不清,换一张

◎欢迎参与讨论,请在这里发表您的看法和观点。