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

572. 另一棵树的子树

题目

给你两棵二叉树 rootsubRoot 。检验 root 中是否包含和 subRoot 具有相同结构和节点值的子树。如果存在,返回 true ;否则,返回 false

二叉树 tree 的一棵子树包括 tree 的某个节点和这个节点的所有后代节点。tree 也可以看做它自身的一棵子树。

解题思路

该问题可以分解成两个子问题:

  1. 如何判断两棵树是否相同?
  2. 如何在主树中寻找可能的子树?

判断两棵树是否相同(isSameTree)
两棵树相同的条件是:

  • 根节点值相同
  • 左子树相同
  • 右子树相同

递归终止条件:

  • 如果两个节点都为空,返回 true
  • 如果一个为空另一个不为空,返回 false
  • 如果两个节点的值不同,返回 false

寻找子树(isSubtree)
我们需要从主树的每个节点出发,判断以该节点为根的子树是否与目标子树相同:

  • 如果当前节点为空,返回 false(空树不可能包含非空子树)
  • 检查当前节点为根的树是否与目标子树相同
  • 如果不同,递归检查左子树和右子树

解题

  1. 提前判断特殊情况
    • 如果 subRoot 为空,根据定义,空树是任何树的子树,返回 true
    • 如果 root 为空但 subRoot 不为空,显然返回 false
  2. 递归的顺序
    • 先判断当前树是否与子树相同
    • 再递归检查左右子树

代码

/*** Definition for a binary tree node.* struct TreeNode {*     int val;*     struct TreeNode *left;*     struct TreeNode *right;* };*/
bool isSameTree(struct TreeNode* p, struct TreeNode* q) {// 如果两个节点都为NULL,认为相同if (p == NULL && q == NULL) return true;// 如果一个为NULL,一个不为NULL,认为不同if (p == NULL || q == NULL) return false;// 如果值不同,认为不同if (p->val != q->val) return false;// 递归比较左右子树return isSameTree(p->left, q->left) && isSameTree(p->right, q->right);
}bool isSubtree(struct TreeNode* root, struct TreeNode* subRoot) {// 如果子树为空,根据定义,空树是任何树的子树if(subRoot == NULL){return true;}// 如果主树为空但子树不为空,返回falseif(root == NULL){return false;}// 检查当前树是否与子树相同if(!isSameTree(root, subRoot)){// 递归判断左右子树和subRoot是否相同return isSubtree(root->left, subRoot) || isSubtree(root->right, subRoot);} else{return true;}
}

改进代码

http://www.dtcms.com/a/302405.html

相关文章:

  • PyTorch武侠演义 第二卷:高塔中的注意力秘境 第1章:残卷指引
  • 11. 若依参数验证 Validated
  • 基于Python和OpenGL的3D暴力摩托游戏完整开发实践
  • Codeforces Round 1039 (Div. 2)题解
  • 架构实战——互联网架构模板(“存储层”技术)
  • redis getshell的三种方法
  • LLM Landscape:2025年大语言模型概览
  • 软工八将:软件开发全流程核心角色体系解析
  • 四、计算机组成原理——第3章:存储系统
  • 分布式渲染效能探析:关键网络性能要素
  • 科技风杂志《科技风》杂志社科技风编辑部2025年第19期目录
  • RWA 正当红,是 DeFi 的终点、拐点,还是新起点?
  • 使用LlamaIndex将私有数据接入大模型
  • 红绿灯纵向距离的评估
  • SpringBoot 发送邮件
  • ServBay 1.15.0 更新,拥抱 Bun Deno 新生态
  • 负载均衡集群HAproxy
  • Claude Launcher:支持Kimi K2的Claude Code可视化启动工具
  • Java面试宝典:MySQL事务底层和高可用原理
  • VUE2 学习笔记11 脚手架
  • 工业前端组件库重构心法:如何让开发效率提升60%的交互模块设计逻辑
  • STM32 USB HOST 驱动FT232 USB转串
  • Flutter在购物场景中BLoC的应用
  • linux安装zsh,oh-my-zsh,配置zsh主题及插件的方法
  • 用了Flutter包体积增大就弃用Flutter吗?包体积与开发效率,这两者之间如何权衡?
  • 形参表不匹配(BUG)
  • 【Git】Linux-ubuntu 22.04 初步认识 -> 安装 -> 基础操作
  • 标准SQL语句示例
  • 专题:2025医药生物行业趋势与投融资研究报告|附90+份报告PDF、原数据表汇总下载
  • 云服务器以域名形式访问机房Kubernetes集群服务之解决方案