二叉树中的链表
1367。二叉树中的链表
难度:中等
主题:链表、树、深度优先搜索、广度优先搜索、二叉树
给定一个二叉树根和一个以头为第一个节点的链表。
如果链表中从头开始的所有元素都对应于二叉树中连接的向下路径,则返回True,否则返回False。
在此上下文中,向下路径是指从某个节点开始并向下的路径。
示例1:
- 输入: head = [4,2,8], root = [1,4,4,null,2,2,null,1,null,6,8,null,null,null,null ,1,3]
- 输出: true
- 说明:蓝色节点构成二叉树中的子路径。
示例2:
- 输入: head = [1,4,2,6], root = [1,4,4,null,2,2,null,1,null,6,8,null,null,null ,null,1,3]
- 输出: true
示例 3:
- 输入: head = [1,4,2,6,8], root = [1,4,4,null,2,2,null,1,null,6,8,null,null ,null,null,1,3]
- 输出: false
- 解释: 二叉树中没有路径包含从 head 开始的链表的所有元素。
约束:
- 树中的节点数将在 [1, 2500] 范围内。
- 列表中的节点数量将在 [1, 100] 范围内。
- 1
提示:
- 给定链表中的指针和二叉树中的任何节点,创建递归函数。检查链表中从头开始的所有元素是否对应二叉树中的某个向下路径。
解决方案:
我们需要递归地检查链表是否可以匹配二叉树中的向下路径。我们将使用深度优先搜索 (DFS) 来探索二叉树,并尝试匹配从头到叶节点的链表。
我们可以采取以下解决方案:
步骤:
- 匹配链表的递归函数:创建一个接受链表节点和树节点的辅助函数。该函数检查从当前节点开始的链表是否与二叉树中的向下路径匹配。
- 通过树进行DFS:使用DFS遍历二叉树,并在每个节点处检查是否存在从该节点开始的匹配。
- 基本条件:如果链表已完全遍历,则递归应停止并返回 true,如果二叉树节点为 null 或值不匹配,则返回 false。
- 在每个节点开始搜索:在每个树节点开始匹配检查,以找到链表的潜在起点。
让我们用 PHP 实现这个解决方案:1367。二叉树中的链表
<?php // Definition for a singly-linked list node. class ListNode { public $val = 0; public $next = null; function __construct($val = 0, $next = null) { $this->val = $val; $this->next = $next; } } // Definition for a binary tree node. class TreeNode { public $val = 0; public $left = null; public $right = null; function __construct($val = 0, $left = null, $right = null) { $this->val = $val; $this->left = $left; $this->right = $right; } } class Solution { /** * @param ListNode $head * @param TreeNode $root * @return Boolean */ function isSubPath($head, $root) { ... ... ... /** * go to ./solution.php */ } // Helper function to match the linked list starting from the current tree node. function dfs($head, $root) { ... ... ... /** * go to ./solution.php */ } } // Example usage: // Linked List: 4 -> 2 -> 8 $head = new ListNode(4); $head->next = new ListNode(2); $head->next->next = new ListNode(8); // Binary Tree: // 1 // / \ // 4 4 // \ \ // 2 2 // / \ / \ // 1 6 8 8 $root = new TreeNode(1); $root->left = new TreeNode(4); $root->right = new TreeNode(4); $root->left->right = new TreeNode(2); $root->right->left = new TreeNode(2); $root->left->right->left = new TreeNode(1); $root->left->right->right = new TreeNode(6); $root->right->left->right = new TreeNode(8); $root->right->left->right = new TreeNode(8); $solution = new Solution(); $result = $solution->isSubPath($head, $root); echo $result ? "true" : "false"; // Output: true ?>
解释:
-
isSubPath($head, $root):
- 该函数递归地检查从 $head 开始的链表是否对应于树中的任何向下路径。
- 它首先检查当前根节点是否是列表的开头(通过调用 dfs)。
- 如果没有,则递归搜索左右子树。
-
dfs($head, $root):
- 此辅助函数检查链表是否与从当前树节点开始的树匹配。
- 如果列表被完全遍历($head === null),则返回true。
- 如果树节点为空或者值不匹配,则返回 false。
- 否则,继续检查左右子节点。
执行示例:
对于输入 head = [4,2,8] 和 root = [1,4,4,null,2,2,null,1,null,6,8],算法将:
- 从根节点(节点1)开始,匹配失败。
- 移动到左子节点(节点4),匹配4,然后向下移动并匹配2,然后匹配8,返回true。
复杂:
- 时间复杂度:O(N * min(L, H)),其中N是二叉树的节点数,L是链表的长度,H是二叉树的高度树。
- 空间复杂度:由于二叉树的递归深度,O(H)。
该解决方案使用 DFS 有效地检查二叉树中的子路径。
联系链接
이 시리즈가 도움이 되었다면 GitHub에서 저장소에 별표를 표시하거나 즐겨찾는 소셜 네트워크에서 게시물을 공유해 보세요. 여러분의 지원은 저에게 큰 의미가 될 것입니다!
이런 유용한 콘텐츠를 더 원하시면 저를 팔로우해주세요.
- 링크드인
- 깃허브
以上是二叉树中的链表的详细内容。更多信息请关注PHP中文网其他相关文章!

热AI工具

Undresser.AI Undress
人工智能驱动的应用程序,用于创建逼真的裸体照片

AI Clothes Remover
用于从照片中去除衣服的在线人工智能工具。

Undress AI Tool
免费脱衣服图片

Clothoff.io
AI脱衣机

Video Face Swap
使用我们完全免费的人工智能换脸工具轻松在任何视频中换脸!

热门文章

热工具

记事本++7.3.1
好用且免费的代码编辑器

SublimeText3汉化版
中文版,非常好用

禅工作室 13.0.1
功能强大的PHP集成开发环境

Dreamweaver CS6
视觉化网页开发工具

SublimeText3 Mac版
神级代码编辑软件(SublimeText3)

JWT是一种基于JSON的开放标准,用于在各方之间安全地传输信息,主要用于身份验证和信息交换。1.JWT由Header、Payload和Signature三部分组成。2.JWT的工作原理包括生成JWT、验证JWT和解析Payload三个步骤。3.在PHP中使用JWT进行身份验证时,可以生成和验证JWT,并在高级用法中包含用户角色和权限信息。4.常见错误包括签名验证失败、令牌过期和Payload过大,调试技巧包括使用调试工具和日志记录。5.性能优化和最佳实践包括使用合适的签名算法、合理设置有效期、

PHP8.1中的枚举功能通过定义命名常量增强了代码的清晰度和类型安全性。1)枚举可以是整数、字符串或对象,提高了代码可读性和类型安全性。2)枚举基于类,支持面向对象特性,如遍历和反射。3)枚举可用于比较和赋值,确保类型安全。4)枚举支持添加方法,实现复杂逻辑。5)严格类型检查和错误处理可避免常见错误。6)枚举减少魔法值,提升可维护性,但需注意性能优化。

SOLID原则在PHP开发中的应用包括:1.单一职责原则(SRP):每个类只负责一个功能。2.开闭原则(OCP):通过扩展而非修改实现变化。3.里氏替换原则(LSP):子类可替换基类而不影响程序正确性。4.接口隔离原则(ISP):使用细粒度接口避免依赖不使用的方法。5.依赖倒置原则(DIP):高低层次模块都依赖于抽象,通过依赖注入实现。

会话劫持可以通过以下步骤实现:1.获取会话ID,2.使用会话ID,3.保持会话活跃。在PHP中防范会话劫持的方法包括:1.使用session_regenerate_id()函数重新生成会话ID,2.通过数据库存储会话数据,3.确保所有会话数据通过HTTPS传输。

静态绑定(static::)在PHP中实现晚期静态绑定(LSB),允许在静态上下文中引用调用类而非定义类。1)解析过程在运行时进行,2)在继承关系中向上查找调用类,3)可能带来性能开销。

RESTAPI设计原则包括资源定义、URI设计、HTTP方法使用、状态码使用、版本控制和HATEOAS。1.资源应使用名词表示并保持层次结构。2.HTTP方法应符合其语义,如GET用于获取资源。3.状态码应正确使用,如404表示资源不存在。4.版本控制可通过URI或头部实现。5.HATEOAS通过响应中的链接引导客户端操作。

在PHP中,异常处理通过try,catch,finally,和throw关键字实现。1)try块包围可能抛出异常的代码;2)catch块处理异常;3)finally块确保代码始终执行;4)throw用于手动抛出异常。这些机制帮助提升代码的健壮性和可维护性。

匿名类在PHP中的主要作用是创建一次性使用的对象。1.匿名类允许在代码中直接定义没有名字的类,适用于临时需求。2.它们可以继承类或实现接口,增加灵活性。3.使用时需注意性能和代码可读性,避免重复定义相同的匿名类。
