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

Leecode刷题C语言之二叉树中的链表

执行结果:通过

执行用时和内存消耗如下:

 

 

bool dfs(struct TreeNode* rt, struct ListNode* head) {// 链表已经全部匹配完,匹配成功if (head == NULL) {return true;}// 二叉树访问到了空节点,匹配失败if (rt == NULL) {return false;}// 当前匹配的二叉树上节点的值与链表节点的值不相等,匹配失败if (rt->val != head->val) {return false;}return dfs(rt->left, head->next) || dfs(rt->right, head->next);
}bool isSubPath(struct ListNode* head, struct TreeNode* root) {if (root == NULL) {return false;}return dfs(root, head) || isSubPath(head, root->left) || isSubPath(head, root->right);
}

解题思路:

这段代码是用来判断一个链表(head)是否是另一个二叉树(root)中某条从根节点开始的路径。下面是代码的思路详解:

dfs 函数

dfs 函数是深度优先搜索(Depth-First Search)的实现,用于检查从给定的二叉树节点 rt 开始,是否存在一条路径能够与链表 head 完全匹配。

  • 参数
    • struct TreeNode* rt:当前遍历到的二叉树节点。
    • struct ListNode* head:当前需要匹配的链表节点。
  • 返回值
    • bool:如果找到匹配的路径,返回 true;否则返回 false
  • 思路
    1. 链表已经全部匹配完:如果 head 为 NULL,表示链表中的所有节点都已经成功匹配,返回 true,表示找到了一条匹配的路径。
    2. 二叉树访问到了空节点:如果 rt 为 NULL,表示在二叉树中无法继续向下匹配了,但链表还未匹配完,因此返回 false
    3. 当前匹配的二叉树上节点的值与链表节点的值不相等:如果当前二叉树节点的值 rt->val 不等于链表节点的值 head->val,则这条路径不可能匹配,返回 false
    4. 递归匹配
      • 尝试从左子树开始匹配:dfs(rt->left, head->next)
      • 如果左子树不匹配,再尝试从右子树开始匹配:dfs(rt->right, head->next)
      • 使用逻辑或 || 操作符,只要有一边匹配成功,整个 dfs 函数就返回 true

isSubPath 函数

isSubPath 函数用于判断链表是否是二叉树中某条路径的子路径。

  • 参数
    • struct ListNode* head:链表头节点。
    • struct TreeNode* root:二叉树根节点。
  • 返回值
    • bool:如果链表是二叉树中某条路径的子路径,返回 true;否则返回 false
  • 思路
    1. 二叉树为空:如果 root 为 NULL,表示整个二叉树为空,链表不可能是其路径,返回 false
    2. 尝试从当前节点开始匹配:调用 dfs(root, head) 尝试从当前二叉树根节点开始匹配链表。
    3. 递归尝试左右子树
      • 如果当前节点开始的匹配失败,则递归地在左子树中继续尝试:isSubPath(head, root->left)
      • 如果左子树也失败,则在右子树中继续尝试:isSubPath(head, root->right)
    4. 逻辑或操作:使用逻辑或 || 操作符,只要有一边返回 true,表示找到了匹配的路径,整个 isSubPath 函数就返回 true

总结来说,这段代码通过深度优先搜索(DFS)递归地检查二叉树的每个节点,看是否存在一条从根节点开始、与给定链表完全匹配的路径。如果在某个节点开始能够匹配成功,或者在其左右子树中能够找到匹配的路径,则返回 true

 


http://www.mrgr.cn/news/81983.html

相关文章:

  • Android 系统 `android.app.Fragment` 类的深度定制与常见问题解析
  • Flutter:打包apk,详细图文介绍(一)
  • Linux硬盘分区 --- gdisk命令GPT分区
  • Spartan6 FPGA ODDR2原语使用方法
  • 聊聊 Java 中的反射
  • Oracle 的网络配置文件详解
  • o1到o3的发展历程
  • 【2024年-7月-20日-开源社区openEuler实践记录】openEuler - Docker - Images:容器化世界的得力助手
  • 【Qt】容器控件、布局管理控件
  • 24.小R的随机播放顺序<字节青训营-中等题>
  • PySide6 一些基础资料
  • 选择器(结构伪类选择器,伪元素选择器),PxCook软件,盒子模型
  • Flutter封装一个三方ViewPager学习
  • 如何规范的提交Git?
  • 「Mac畅玩鸿蒙与硬件48」UI互动应用篇25 - 简易购物车功能实现
  • logback之自定义pattern使用的转换器
  • jetbrains HTTPS 请求与响应流量分析报告【二】
  • vuex - 第一天
  • apifox
  • 搭建ORB-SLAM3编译环境
  • GDPU Vue前端框架开发 期末赛道出勇士篇(更新ing)
  • GXUOJ-算法-第二次作业(矩阵连乘、最长公共子序列、0-1背包问题、带权区间调度)
  • fpga系列 HDL:ModelSim显示模拟波形+十进制格式数值(临时方法和设置持久化的默认值)
  • Unity中列表List使用出类似字典Dictionary的感觉
  • UE5材质节点Panner
  • Elasticsearch:analyzer(分析器)