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

剑指offer-57、二叉树的下一个节点

题⽬描述

给定⼀个⼆叉树和其中的⼀个结点,请找出中序遍历顺序的下⼀个结点并且返回。注意,树中的结点不仅包含左右⼦结点,同时包含指向⽗结点的指针。

复杂的节点结构如下:

java

public class TreeLinkNode { int val; TreeLinkNode left = null; TreeLinkNode right = null; TreeLinkNode next = null; TreeLinkNode(int val) { this.val = val; } }

思路及解答

中序遍历

先找到根节点,然后通过根节点,中序遍历,中序遍历的过程中,对⽐节点,是否等于输⼊的节点,然后获取下⼀个节点放回。注意没有下⼀个节点的时候,应该返回 null ,不能数组越界。

java

import java.util.ArrayList; import java.util.List; public class Solution { private static List<TreeLinkNode> treeLinkNodes = new ArrayList<>(); public TreeLinkNode GetNext(TreeLinkNode pNode) { if (pNode != null) { TreeLinkNode root = pNode; // ⼀直找到根节点 while (root != null && root.next != null) { root = root.next; } inOrder(root); for (int i = 0; i < treeLinkNodes.size(); i++) { if (treeLinkNodes.get(i) == pNode) { return i + 1 < treeLinkNodes.size() ? treeLinkNodes.get(i + 1) : null; } } } return null; } // 中序遍历 public void inOrder(TreeLinkNode pNode) { if (pNode != null) { inOrder(pNode.left); treeLinkNodes.add(pNode); inOrder(pNode.right); } } }
  • 时间复杂度:O(n)。需要遍历整棵树(O(n))并在列表中查找节点(最坏O(n))。
  • 空间复杂度:O(n)。

不借助额外的空间(推荐)

据中序遍历的顺序规则和节点的位置关系,通过指针操作直接定位。

核心思路:中序遍历的顺序是“左-根-右”。给定节点的“下一个节点”取决于它自己的位置情况

分为⼏种情况讨论:

  • 当前节点为空,直接返回空
  • 当前节点不为空:
    • 如果当前节点的右节点不为空,那么下⼀个节点就是右节点的最左⼦孙节点。
    • 如果当前节点的右节点为空,那么只能到⽗节点:
      • 需要判断当前节点是不是⽗节点的左节点,如果是⽗节点的左节点,那么下⼀个节点就是⽗节点。
      • 如果当前节点不是⽗节点的左节点,那么就是⽗节点的右节点,也就是下⼀个节点应该是⽗节点的⽗节点,或者更上⼀层。这个怎么判断呢?根据当前节点是不是右节点来判断,如果是右节点,则还需要往⽗节点的上⾛⼀层,如果不是右节点,则直接放回⽗节点。

java

public TreeLinkNode GetNext(TreeLinkNode pNode) { // 右节点不为空,直接找右节点的最左⼦孙节点 if (pNode.right != null) { TreeLinkNode pRight = pNode.right; while (pRight.left != null) { pRight = pRight.left; } return pRight; } // 右节点为空,但是当前节点是左节点,下⼀个就是其⽗节点 if (pNode.next != null && pNode.next.left == pNode) { return pNode.next; } // 3.右节点为空,并且当前节点是右节点,那只能往上⾛ if (pNode.next != null) { // 获取⽗节点 TreeLinkNode pNext = pNode.next; // 判断⽗节点是不是同样是右节点,如果是,还需要往上⾛,如果不是,就可以直接放回其 while (pNext.next != null && pNext.next.right == pNext) { pNext = pNext.next; } return pNext.next; } return null; }
  • 时间复杂度:O(k)。k是到后继节点的路径长度,最坏情况为树高O(h),通常远小于n。
  • 空间复杂度:O(1)。只使用了固定数量的指针。
http://www.cnnetsun.cn/news/1609459.html

相关文章:

  • 鸿蒙 HarmonyOS 6 | Video 组件网络视频播放异常排查实战
  • wifi相关查询指令
  • Omni-Vision Sanctuary 模拟电路设计可视化:与 Multisim 仿真结果结合生成原理图效果图
  • GD32F4/H7上移植FreeRTOS+YT8512驱动,从LAN8700例程到实战的保姆级避坑记录
  • Android Studio中文界面终极配置指南:快速告别英文开发困境
  • 深入解析J1939协议中的PDU报文格式与PGN计算
  • 零基础入门AI开发:在快马平台创建你的第一个对话skills智能体
  • 基于Phi-3-mini-128k-instruct构建运维智能助手:Linux命令分析与故障排查
  • 睡眠监测项目踩坑记:STM32读取心率/体温传感器,数据上传OneNET时我遇到的3个典型问题
  • CosyVoice2效果展示:实测跨语种语音合成,中文音色说英文日文
  • 如何依据GB/T34944-2017开展Java代码漏洞测试(一)
  • 终极智能配置革命:自动化Hackintosh工具完整指南
  • 零基础入门FLUX.2-Klein-9B:5分钟生成左右对比图,效果直观
  • TypeScript 要换芯了,6.0 竟是旧编译器的最后一舞
  • scp传输大文件中断续传工具rsync介绍
  • Snap.Hutao:一款革命性的开源原神工具箱,彻底改变你的游戏体验
  • MySQL IF 和 IFNULL 用法详解
  • 革新性键盘定制引擎:ZMK固件如何重塑机械键盘体验
  • Amlogic S9XXX Armbian:3步让你的电视盒子变身全能服务器
  • [特殊字符] Local Moondream2开发者案例:集成图文对话功能到自有平台
  • 5分钟搞定!前端在线预览Office文档的3种零成本方案(含PDF/Word/Excel/PPT)
  • 用 AI 生成 n8n 工作流,15 分钟搭完我手动要搞半天的东西
  • AI辅助开发:用自然语言让快马AI为你编写地道的jdk1.8函数式代码
  • Windows 11本地Ollama大模型部署实战指南
  • 别再硬编码了!用注解+工厂模式,5分钟为你的Java应用扩展一个新PLC协议(ModbusTCP/S7为例)
  • 别光知道gcc main.c了!拆解GCC编译的4个阶段,手把手教你用-E、-S、-c选项看中间文件
  • 告别发热!用TPS54360改造你的LM317线性电源(效率提升300%)
  • 探秘书匠策AI:毕业论文全流程的“智慧魔法师”
  • 基于Spark+Hadoop+Hive 大数据 深度学习 机器学习的豆瓣电子图书推荐系统
  • 终极GPU显存稳定性测试指南:使用memtest_vulkan轻松诊断显卡问题