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

经典算法实例应用:后继者(二)

接上文,小编来分享第二种解题思路:

方法二:利用二叉搜索树的性质

二叉搜索树的一个性质是中序遍历序列单调递增,因此二叉搜索树中的节点 p 的后继节点满足以下条件:​

后继节点的节点值大于 p 的节点值;
后继节点是节点值大于 p 的节点值的所有节点中节点值最小的一个节点。

利用二叉搜索树的性质,可以在不做中序遍历的情况下找到节点 p 的后继节点。

如果节点 p 的右子树不为空,则节点 p 的后继节点在其右子树中,在其右子树中定位到最左边的节点,即为节点 p 的后继节点。

如果节点 p 的右子树为空,则需要从根节点开始遍历寻找节点 p 的祖先节点。

将答案初始化为 null。用 node 表示遍历到的节点,初始时node=root。每次比较 node 的节点值和 p 的节点值,执行相应操作:

如果 node 的节点值大于 p 的节点值,则 p 的后继节点可能是 node 或者在 node 的左子树中,因此用 node 更新答案,并将 node 移动到其左子节点继续遍历;
如果 node 的节点值小于或等于 p 的节点值,则 p 的后继节点可能在 node 的右子树中,因此将 node 移动到其右子节点继续遍历。

由于在遍历过程中,当且仅当 node 的节点值大于 p 的节点值的情况下,才会用 node 更新答案,因此当节点 p 有后继节点时一定可以找到后继节点,当节点 p 没有后继节点时答案一定为 null。

代码

Python3

class Solution: def inorderSuccessor(self, root: TreeNode, p: TreeNode) -> TreeNode: successor = None if p.right: successor = p.right while successor.left: successor = successor.left return successor node = root while node: if node.val > p.val: successor = node node = node.left else: node = node.right return successor

Java

class Solution { public TreeNode inorderSuccessor(TreeNode root, TreeNode p) { TreeNode successor = null; if (p.right != null) { successor = p.right; while (successor.left != null) { successor = successor.left; } return successor; } TreeNode node = root; while (node != null) { if (node.val > p.val) { successor = node; node = node.left; } else { node = node.right; } } return successor; } }

C#

public class Solution { public TreeNode InorderSuccessor(TreeNode root, TreeNode p) { TreeNode successor = null; if (p.right != null) { successor = p.right; while (successor.left != null) { successor = successor.left; } return successor; } TreeNode node = root; while (node != null) { if (node.val > p.val) { successor = node; node = node.left; } else { node = node.right; } } return successor; } }

复杂度分析

  • 时间复杂度:O(n) ,其中 n 是二叉搜索树的节点数。遍历的节点数不超过二叉搜索树的高度,平均情况是 O(logn),最坏情况是 O(n) 。
  • 空间复杂度:O(1) 。
http://www.jsqmd.com/news/1153286/

相关文章:

  • AI 相关概念之(基础层级):机器学习、神经网络、深度学习
  • 小团队知识库软件怎么选?2026年主流工具对比与精选盘点
  • 如何将B站缓存视频转换为MP4:m4s-converter完整使用指南
  • Seraphine:基于LCU API的现代化英雄联盟战绩查询与游戏辅助工具
  • 亚远景科技受邀亮相 2026 上海国际低碳智慧出行展览会
  • “Sample Is Feature: Beyond Item-Level, Toward Sample-Level Tokens for Unified Large Recommender Mode
  • 科创企业商业秘密保护的核心价值与落地意义|筑牢研发数据与技术壁垒
  • Meta-Llama-3 模型权重申请与下载:GitHub/Hugging Face 双路径 3 小时全流程
  • 终极百度网盘直链解析教程:告别限速的简单Python工具
  • BetterGI:智能游戏助手,彻底解放你的原神游戏时间
  • B站视频格式转换终极方案:5秒完成m4s到MP4无损转换
  • 创业孵化运营升级:创业导师如何贯穿园区全链路运营
  • 飞书服务端SDK v1.0 集成实战:3步完成消息推送与事件订阅
  • 工业机器人公司有没有在真实场景跑过的?用数据说话
  • Managers/APConfigManager.cs
  • 网络安全——计算机网络基础下(下篇)
  • 通用下载方法
  • 3分钟永久备份B站视频:m4s-converter让缓存视频永不失效的完整指南
  • 【新手快速上手】 OpenClaw 本地离线 AI 智能体 Windows 搭建实操手册(含安装包)
  • 拥抱 Markdown 带来的奇妙世界
  • Ansys Workbench 屈曲分析:特征值 vs 非线性 5大核心差异与工程选型指南
  • Cesium@1.138中实现标尺绘制功能
  • quartus与vivado 的debug标记代码对比
  • NVIDIA Profile Inspector终极指南:如何解决驱动兼容性崩溃问题
  • 计算机毕业设计之基于SSM框架的医院信息管理系统设计与实现
  • 深度解析NVIDIA Profile Inspector在571.96驱动版本中的内存访问异常与修复方案
  • 从故事点到概率分布:用贝叶斯模型重塑项目工期估算的决策质量
  • 合肥七七音响亲测,2026年7月效果超赞
  • 别再为懒惰找借口!居家也能练出“超模感”,这套方案建议锁死!
  • 火龙果矮砧密植,水肥一体滴灌系统搭建实战指南(配套图解)