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

剑指offer23_树的子结构

树的子结构


输入两棵二叉树 A,B,判断 B 是不是 A 的子结构。

我们规定空树不是任何树的子结构。

数据范围

每棵树的节点数量 [ 0 , 1000 ] [0,1000] [0,1000]

样例

树 A:

     8/ \8   7/ \9   2/ \4   7

树 B:

   8/ \9   2

返回 true,因为 B 是 A 的子结构。


算法思路

第一部分:遍历树A
  • 递归遍历树A中的所有非空节点R
  • 对每个非空节点R,进行第二部分的匹配判断
第二部分:子树匹配判断

同时从根节点开始遍历两棵子树:

  1. 终止条件
    • 如果树B中的节点为空 → 匹配成功,返回true
    • 如果树A中的节点为空但树B不为空 → 匹配失败,返回false
    • 如果两节点都不为空但值不同 → 匹配失败,返回false
  2. 递归判断
    • 当前节点匹配成功后,递归判断左右子树:

时间复杂度分析

  • 最坏情况:需要遍历树A中的每个节点(n个),对每个节点都要完整遍历树B(m个)
  • 时间复杂度:O(n×m)
    • n:树A的节点数
    • m:树B的节点数
/*** Definition for a binary tree node.* struct TreeNode {*     int val;*     TreeNode *left;*     TreeNode *right;*     TreeNode(int x) : val(x), left(NULL), right(NULL) {}* };*/
class Solution {
public:bool hasSubtree(TreeNode* pRoot1, TreeNode* pRoot2) {if(!pRoot1 || !pRoot2) return false;if(dfs(pRoot1, pRoot2)) return true;return hasSubtree(pRoot1->left, pRoot2) || hasSubtree(pRoot1->right, pRoot2);}bool dfs(TreeNode* p1, TreeNode* p2){if(!p2) return true;if(!p1 || p1->val != p2->val) return false;return dfs(p1->left, p2->left) && dfs(p1->right, p2->right);}
};

相关文章:

  • 深度学习之模型压缩三驾马车:基于ResNet18的模型剪枝实战(3)
  • ubuntu安装libevent
  • 如何连上Nacos
  • 产品成本分析怎么做?从0到1搭建全生命周期分析框架!
  • JDK版本如何丝滑切换
  • BeanUtil.copyProperties()进行属性拷贝时如何忽略NULL值——CopyOptions配置详解
  • CKA考试知识点分享(12)---configmap
  • 005__C++类的基本语法
  • 洛谷P4555 最长双回文串
  • 从监测滞后到全域智控:河湖智慧化管理方案
  • python程序设计(2)
  • LeetCode 72. 编辑距离(Edit Distance)| 动态规划详解
  • 【推荐算法课程二】推荐算法介绍-深度学习算法
  • 日语语法学习
  • 模型合并(model merge)
  • CC工具箱使用指南:【面要素四至】
  • 报表工具顶尖对决系列—关联过滤
  • /proc/<pid>/maps文件格式详解
  • 声学成像仪在电力行业的应用品牌推荐
  • JavaWeb期末速成 Servlet
  • 做网站哪里的好/怎么做网站优化排名
  • 自己做网站生意怎么样/网站优化公司排名
  • 手机网站优化排名/搜索引擎优化不包括
  • 重庆 企业网站建设/西安网是科技发展有限公司
  • 邯郸网站建设效果/优化排名推广教程网站
  • 江苏建设主管部门网站/成都网站seo厂家