news 2026/11/3 20:09:03

LeetCode树与链表基础题解析:108与203题精讲

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
LeetCode树与链表基础题解析:108与203题精讲

1. 项目概述

今天要分享的是LeetCode上两道经典题目:108题"将有序数组转化为二叉树"和203题"移除链表元素"。这两道题分别代表了树和链表这两个数据结构中的基础操作,也是面试中的高频考点。

我刷了300+道LeetCode题目后发现,很多复杂的树和链表问题其实都是基于这些基础操作的变种。掌握好这两道题,不仅能帮你快速解决类似问题,更能深入理解递归思想和指针操作的精髓。

2. 核心需求解析

2.1 有序数组转二叉树(LeetCode 108)

题目要求将一个按照升序排列的有序数组,转换为一棵高度平衡的二叉搜索树。这里有几个关键点需要注意:

  1. 高度平衡:左右子树的高度差不超过1
  2. 二叉搜索树:左子树所有节点值 < 根节点值 < 右子树所有节点值
  3. 有序数组:已经排序好的数组,可以直接利用这个特性

2.2 移除链表元素(LeetCode 203)

题目要求从链表中删除所有等于给定值的节点。看似简单,但实际处理时需要考虑多种边界情况:

  1. 头节点就是要删除的节点
  2. 连续多个节点都要删除
  3. 空链表的情况
  4. 所有节点都要删除的情况

3. 解题思路与实现

3.1 有序数组转二叉树的递归解法

这道题最直观的解法就是递归。因为要构建平衡BST,我们可以每次都选择数组中间的元素作为根节点:

def sortedArrayToBST(nums): if not nums: return None mid = len(nums) // 2 root = TreeNode(nums[mid]) root.left = sortedArrayToBST(nums[:mid]) root.right = sortedArrayToBST(nums[mid+1:]) return root

时间复杂度分析:每次递归都将问题规模减半,所以是O(n),空间复杂度由于递归栈也是O(logn)。

注意:Python的切片操作nums[:mid]会创建新数组,这在处理大数组时会有额外空间开销。更优的做法是传递索引而不是切片。

3.2 移除链表元素的迭代解法

链表删除操作的关键是处理好指针的指向。我们可以使用哨兵节点(dummy node)来简化头节点的处理:

def removeElements(head, val): dummy = ListNode(0) dummy.next = head prev, curr = dummy, head while curr: if curr.val == val: prev.next = curr.next else: prev = curr curr = curr.next return dummy.next

这个解法的时间复杂度是O(n),空间复杂度是O(1)。

4. 常见问题与优化

4.1 有序数组转二叉树的常见错误

  1. 忘记处理空数组的情况
  2. 中间位置计算错误(应该用//而不是/)
  3. 递归终止条件不完整
  4. 切片操作导致的空间浪费

优化建议:改用索引传递避免切片

def sortedArrayToBST(nums): def helper(left, right): if left > right: return None mid = (left + right) // 2 root = TreeNode(nums[mid]) root.left = helper(left, mid-1) root.right = helper(mid+1, right) return root return helper(0, len(nums)-1)

4.2 移除链表元素的易错点

  1. 忘记处理头节点就是要删除的情况
  2. 删除节点后忘记移动prev指针
  3. 处理连续要删除的节点时逻辑错误
  4. 空链表未做特殊处理

优化建议:递归解法虽然空间复杂度高,但代码更简洁

def removeElements(head, val): if not head: return None head.next = removeElements(head.next, val) return head.next if head.val == val else head

5. 相关题目扩展

掌握了这两道基础题后,可以尝试以下进阶题目:

  1. 二叉树相关:

      1. 有序链表转换二叉搜索树
      1. 平衡二叉树
      1. 删除二叉搜索树中的节点
  2. 链表相关:

      1. 删除排序链表中的重复元素 II
      1. 删除排序链表中的重复元素
      1. 删除链表的倒数第N个节点

6. 个人刷题心得

在刷了这么多树和链表的题目后,我总结了几个关键点:

  1. 树的问题90%可以用递归解决,关键是找到递归终止条件和递归关系
  2. 链表问题多用哨兵节点可以简化边界条件处理
  3. 画图!画图!画图!重要的事情说三遍,把问题可视化能帮助理解
  4. 先写伪代码理清思路,再实现细节
  5. 测试用例要覆盖各种边界情况(空、单节点、全要删除等)

最后一个小技巧:对于树的问题,可以先用小规模的例子(3-5个节点)手动构建一遍,这样能更直观地理解题目要求。

版权声明: 本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!
网站建设 2026/11/3 20:08:10

Archery SQL审计平台在RockyLinux8的容器化部署实践

1. 为什么选择Archery作为SQL审计平台在数据库运维领域&#xff0c;SQL审计一直是保障数据安全的重要环节。Archery作为开源的SQL审核平台&#xff0c;相比商业产品具有几个显著优势&#xff1a;首先它支持多数据库类型&#xff08;MySQL、PostgreSQL、Oracle等&#xff09;&am…

作者头像 李华
网站建设 2026/11/3 20:07:30

Godot协程等待机制:从裸await到可取消超时等待库

上周帮一位朋友看他那个小型横版项目&#xff0c;翻到关卡流程脚本时我愣了一下&#xff1a;一个 400 行的文件里塞了三十七处await get_tree().create_timer(...).timeout&#xff0c;还有十几处裸await各种信号&#xff0c;中间夹着两三个queue_free()。我问他这套跑起来稳不…

作者头像 李华
网站建设 2026/11/3 20:03:57

Hadoop在教育大数据中的实践:自闭症儿童个性化教学

1. 项目背景与核心价值自闭症儿童教育一直面临资源分配不均和个性化教学方案缺失的双重挑战。传统教育系统往往采用"一刀切"的教学模式&#xff0c;难以满足自闭症谱系障碍(ASD)儿童的特殊需求。我们团队开发的这套系统&#xff0c;正是要利用大数据技术解决这个痛点…

作者头像 李华
网站建设 2026/11/3 20:03:54

同义词算法实战:从规则到SBERT的工程落地指南

1. 这不是词典查询&#xff0c;而是让机器真正“理解”词语关系的实战路径“同义词&#xff08;近义词&#xff09;算法总结&#xff08;附代码&#xff09;”——看到这个标题&#xff0c;很多人第一反应是&#xff1a;不就是查个《现代汉语词典》或者调用jieba、HanLP的synon…

作者头像 李华
网站建设 2026/11/3 20:03:21

C++悬垂引用与未定义行为的防范实践

1. 悬垂引用&#xff1a;C程序员必须警惕的"定时炸弹"1.1 什么是悬垂引用悬垂引用&#xff08;Dangling Reference&#xff09;就像你拿着过期的电影票——票根还在手里&#xff0c;但对应的座位可能已经被重新分配。在C中&#xff0c;它特指引用了一个已经被销毁的对…

作者头像 李华
网站建设 2026/11/3 20:00:46

工厂直供模式如何加速自动化核心部件迭代

1. 工厂直供模式&#xff1a;自动化核心部件迭代的破局之道在自动化设备制造领域&#xff0c;核心部件的迭代速度往往决定了整机产品的竞争力。传统供应链中&#xff0c;从零部件厂商到设备制造商之间冗长的中间环节&#xff0c;已成为制约创新的主要瓶颈。最近参加行业展会时&…

作者头像 李华