当前位置: 首页 > news >正文

剑指offer-17、树的⼦结构

题⽬描述

输⼊两棵⼆叉树A , B ,判断B 是不是A 的⼦结构。(ps:我们约定空树不是任意⼀个树的⼦结构)

假如给定A 为{8,8,7,9,2,#,#,#,#,4,7} , B 为{8,9,2} , 2 个树的结构如下,可以看出B是A 的⼦结构:

思路及解答

双重递归法(标准解法)

使用两个递归函数:

  1. isSubStructure:遍历树A的每个节点,寻找与树B根节点值相同的节点
  2. recur:从匹配的节点开始,递归比较两棵树的对应节点是否相同
public class Solution {public boolean isSubStructure(TreeNode A, TreeNode B) {// 空树不是任何树的子结构if (A == null || B == null) return false;// 三种情况满足一种即可:// 1. B是以A为根的子结构// 2. B是A左子树的子结构// 3. B是A右子树的子结构return hasSubtree(A, B) || isSubStructure(A.left, B) || isSubStructure(A.right, B);}// 判断B是否是A的子结构(从当前节点开始)private boolean hasSubtree(TreeNode A, TreeNode B) {// B已经遍历完,说明匹配成功if (B == null) return true;// A遍历完但B还有节点,或节点值不匹配if (A == null || A.val != B.val) return false;// 递归比较左右子树return hasSubtree(A.left, B.left) && hasSubtree(A.right, B.right);}
}
  • 时间复杂度​:O(mn),m和n分别是树A和树B的节点数
  • 空间复杂度​:O(m),递归栈的深度最大为树A的高度

迭代+递归混合法

  1. 使用迭代法(栈或队列)遍历树A
  2. 当找到与树B根节点值相同的节点时,切换到递归比较
  3. 结合了迭代和递归的优点
public class Solution {public boolean isSubStructure(TreeNode A, TreeNode B) {if (A == null || B == null) return false;Stack<TreeNode> stack = new Stack<>();stack.push(A);while (!stack.isEmpty()) {TreeNode node = stack.pop();// 找到匹配的根节点,开始递归比较if (node.val == B.val && compareTrees(node, B)) {return true;}if (node.right != null) stack.push(node.right);if (node.left != null) stack.push(node.left);}return false;}private boolean compareTrees(TreeNode A, TreeNode B) {if (B == null) return true;if (A == null || A.val != B.val) return false;return compareTrees(A.left, B.left) && compareTrees(A.right, B.right);}
}
  • 时间复杂度​:O(mn)
  • 空间复杂度​:O(m),栈的空间消耗
http://www.sczhlp.com/news/1453/

相关文章:

  • 2025年:是时候重新认识System.Text.Json了
  • 阿萨QSDFG - kkksc03
  • HTML学习地址 - kkksc03
  • 我天,IntelliJ IDEA 要免费使用了?
  • Java入门:解释型和解释型
  • 【数据库基石】聚簇索引 vs 非聚簇索引:结构图解、性能差异与最佳实践
  • VMware ESXi 8.0U3g macOS Unlocker OEM BIOS 2.7 集成网卡驱动和 NVMe 驱动 (集成驱动版)
  • 搭建imx6ull环境--tftp加载镜像,nfs挂载根文件系统
  • VMware ESXi 8.0U3g macOS Unlocker OEM BIOS 2.7 标准版和厂商定制版
  • 大概是……北京游记?
  • 探索Docker容器化技术
  • 加密货币硬件钱包安全使用的10条黄金法则
  • Splunk Enterprise 10.0.0 (macOS, Linux, Windows) - 搜索、分析和可视化,数据全面洞察平台
  • 数据库查询通信开销降低97%的新方法
  • 开源智能体框架
  • 2025 WAIC世界人工智能大会 - 汽车智能/自动驾驶分会场大佬们都分享了些什么?
  • 面板级封装(PLP)2025年技术、市场和供应链全览
  • 砺算科技GPU背后的故事
  • Qt/C++开发监控GB28181系统/录像回放/切换播放进度立即跳转/支持8倍速播放/倍速和跳转进度无缝切换
  • 失业潮下,究竟谁在不停拿offer?(转发猎头文章)
  • 读用数据说服:如何设计、呈现和捍卫你的数据09读后总结与感想兼导读
  • webapi第二天
  • webapi第一天
  • js高级第四天
  • 知识蒸馏优化多任务学习收敛性
  • 网络嗅探工具Intercepter-NG的技术内幕与黑客文化变迁
  • 使用.NET实现自带思考的Tool 并且提供mcp streamable http服务
  • aaPanel 设置加 ThinkPHP 伪静态代码
  • 5. Warp and Bank
  • WiFiManager 项目