【牛客 - 剑指offer】JZ8 二叉树的下一个结点 Java实现

news/2024/5/17 15:57:35/文章来源:https://blog.csdn.net/guliguliguliguli/article/details/126826328

文章目录

  • 剑指offer题解汇总 Java实现
  • 本题链接
  • 题目
  • 方案一 中序遍历递归
    • 代码一 设置flag标记
    • 代码二 获取整个arrayList的大小
  • 方案二 分类直接寻找(分情况讨论)
    • 思路
    • 代码(版本一)
    • 代码(版本二)


剑指offer题解汇总 Java实现

https://blog.csdn.net/guliguliguliguli/article/details/126089434

本题链接

知识分类篇 - 树 - JZ86 在二叉树中找到两个节点的最近的公共祖先

题目

在这里插入图片描述
在这里插入图片描述
题目的主要信息

  • 给出一棵树其中某一个结点指针

  • 返回这棵树按照中序遍历的该节点的下一个顺序节点

  • 树的每个节点都有三个指针,指向左子节点、右子节点、父节点

方案一 中序遍历递归

递归是一个过程或函数在其定义或说明中有直接或间接调用自身的一种方法,它通常把一个大型复杂的问题层层转化为一个与原问题相似的规模较小的问题来求解。因此递归过程,最重要的就是查看能不能将原本问题分解为更小的子问题,这是递归使用的关键。

而二叉树的递归,则是将某个节点的左子树、右子树看成一棵完整的树,那么对于子树的访问或者操作的子问题,因此可以自我调用函数不断进入子树。

思路

首先根据给定输入中的节点指向父级进行迭代,直到找到该树的根节点;然后进行中序遍历,当遍历到和给定树节点相同的节点时,下一个节点就是要返回的目标节点

具体做法

  1. 首先根据当前给出的节点找出根节点

  2. 从根节点开始中序遍历

  3. 将中序遍历的结果存储下来

  4. 最终拿当前节点匹配是否有符合要求的下一个节点

注意

中序遍历结束以后,arrayList中是按照中序遍历顺序存储的节点,在找到目标节点以后,只要返回它的下一个就好,我的代码是设置了一个flag,初始化为false,找到以后就会设置为true。在进入下一次循环,检查到flag为true,直接返回该节点即可。

代码一 设置flag标记

import java.util.*;/*
public class TreeLinkNode {int val;TreeLinkNode left = null;TreeLinkNode right = null;TreeLinkNode next = null;TreeLinkNode(int val) {this.val = val;}
}
*/
public class Solution {private ArrayList<TreeLinkNode> inOrderNodes = new ArrayList<>();public TreeLinkNode GetNext(TreeLinkNode pNode) {TreeLinkNode targetNode = pNode;while (pNode.next != null) {pNode = pNode.next;}inOrderSearch(pNode);boolean flag = false;for (TreeLinkNode inOrderNode : inOrderNodes) {if (flag) {return inOrderNode;}if (inOrderNode.val == targetNode.val) {flag = true;}}return null;}private void inOrderSearch(TreeLinkNode pNode) {if (pNode == null) {return;}inOrderSearch(pNode.left);inOrderNodes.add(pNode);inOrderSearch(pNode.right);}
}

代码二 获取整个arrayList的大小

官方给出的代码,是直接获取arrayList的大小,还有一个小细节,就是在for循环中,结束的条件并不是i<size,而是i<size-1,这样的处理是为了避免目标节点是中序遍历中的最后一个节点,这样该节点的下一个节点是null,通过arrayList.get(i+1)会出错(细节满分)

对于没有找到的,会在for循环结束以后,返回null

修改的代码

int size = inOrderNodes.size();
for (int i = 0; i < size - 1; i++) {if (inOrderNodes.get(i) == targetNode) {return inOrderNodes.get(i + 1);}
}
return null;

完整的代码

import java.util.*;/*
public class TreeLinkNode {int val;TreeLinkNode left = null;TreeLinkNode right = null;TreeLinkNode next = null;TreeLinkNode(int val) {this.val = val;}
}
*/
public class Solution {private ArrayList<TreeLinkNode> inOrderNodes = new ArrayList<>();public TreeLinkNode GetNext(TreeLinkNode pNode) {TreeLinkNode targetNode = pNode;while (pNode.next != null) {pNode = pNode.next;}inOrderSearch(pNode);int size = inOrderNodes.size();for (int i = 0; i < size - 1; i++) {if (inOrderNodes.get(i) == targetNode) {return inOrderNodes.get(i + 1);}}return null;}private void inOrderSearch(TreeLinkNode pNode) {if (pNode == null) {return;}inOrderSearch(pNode.left);inOrderNodes.add(pNode);inOrderSearch(pNode.right);}
}

方案二 分类直接寻找(分情况讨论)

思路

  1. 如果给出的节点有右子节点,则最终要返回的下一个节点即右子树的最左下的节点

注意不是该节点的右节点,因为可能会出现右节点又是一棵子树的情况,所以要不断深入到右子树最左下的节点

  1. 如果给出的节点无右子节点

    • 判断该节点是否有父节点

      • 没有父节点

        • 则该节点就是中序遍历的最后一个节点,返回null
      • 有父节点

        • 且是当前节点是其父节点的左子节点,则返回其父节点

        • 且是当前节点是其父节点的右子节点,则先要沿着左上方父节点爬树,一直爬到当前节点是其父节点的左子节点为止,返回的就是这个父节点;如果没有满足条件的节点,则返回NULL

代码(版本一)

根据上面的思路,写的代码

import java.util.*;/*
public class TreeLinkNode {int val;TreeLinkNode left = null;TreeLinkNode right = null;TreeLinkNode next = null;TreeLinkNode(int val) {this.val = val;}
}
*/
public class Solution {public TreeLinkNode GetNext(TreeLinkNode pNode) {//有右子节点if (pNode.right != null) {pNode = pNode.right;while (pNode.left != null) {pNode = pNode.left;}return pNode;} else {//无右子节点//判断是否有父节点//没有父节点,也没有右子节点if (pNode.next == null) {return null;} else {//有父节点//判断是否是其父节点的左子节点if (pNode.next.left == pNode) {return pNode.next;} else {//不是该父节点的左子节点,即是该父节点的右子节点while (pNode.next != null && pNode.next.left != pNode) {pNode = pNode.next;}if (pNode.next == null) {return null;}return pNode.next;}}}}
}

代码(版本二)

根绝官方给的代码,把上面的代码修改了一下,更简洁一些

import java.util.*;public class Solution {public TreeLinkNode GetNext(TreeLinkNode pNode) {// 情况一if (pNode.right != null) {pNode = pNode.right;// 一直找到右子树的最左下的结点为返回值while (pNode.left != null) {pNode = pNode.left;}return pNode;}// 情况二//该节点的父节点不为空,且该节点是父节点的左子节点if (pNode.next != null && pNode.next.left == pNode) {return pNode.next;}// 情况三//该节点的父节点不为空,且该节点是父节点的右子节点// 沿着左上一直爬树,爬到当前结点是其父节点的左自己结点为止while (pNode.next != null && pNode.next.left != pNode) {pNode = pNode.next;}if (pNode.next == null) {return null;}return pNode.next;}
}

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.luyixian.cn/news_show_6981.aspx

如若内容造成侵权/违法违规/事实不符,请联系dt猫网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

计算机毕业设计成品java项目开发实例SSM+MySQL实现的家庭医生预约平台

&#x1f496;&#x1f496;更多项目资源&#xff0c;最下方联系我们✨✨✨✨✨✨ 目录 一、项目介绍 二、项目截图 三、项目获取 一、项目介绍 java毕业设计计算机毕设项目之基于SSMMySQL实现的家庭医生预约平台_哔哩哔哩_bilibilijava毕业设计计算机毕设项目之基于SSMMyS…

记首次协助搭建服务器

一&#xff0c;服务器资源申请 1&#xff09;使用云服务器&#xff08;k8s&#xff09;还是IDC服务器 云服务器VS IDC服务器 不同&#xff1a; 费用一样&#xff0c;云服务器支持动态扩容 私有云和IDC没有很大区别&#xff0c;只是私有云支持k8s&#xff0c;动态扩容方便。…

python 日志处理(基础篇)

Logging处理 日志级别等级排序&#xff1a;critical > error > warning > info > debug debug : 打印全部的日志( notset 等同于 debug ) info : 打印 info, warning, error, critical 级别的日志 warning : 打印 warning, error, critical 级别的日志 error : 打…

笑霸餐厅 | 瑞吉外卖项目 | 完整基础部分(后端学习笔记)

前言&#xff1a; &#x1f44f;作者简介&#xff1a;我是笑霸final&#xff0c;一名热爱技术的在校学生。 &#x1f4dd;个人主页&#xff1a;个人主页1 || 笑霸final的主页2 &#x1f4d5;系列专栏&#xff1a;项目专栏 &#x1f4e7;如果文章知识点有错误的地方&#xff0c;…

Android ActionBar

android的ActionBar是3.0才推出的,3.0之前称之为AppBar。为了向后兼容,ActionBar位于Android的支持库AppCompat中,所以要使用ActionBar先必须依赖AppCompat库(现在新建的工程默认都依赖此库了)implementation androidx.appcompat:appcompat:1.3.0如果没有在主题Theme中或Ac…

【小月电子】安路国产FPGA开发板系统学习教程-LESSON6按键消抖

按键消抖例程讲解若要观看该博客配套的视频教程&#xff0c;可点击此链接根据多年工作经验&#xff0c;总结出的FPGA的设计流程&#xff0c;概括起来总共有以上12步&#xff0c;其中根据项目难易度可省去其中一些步骤。比如非常简单的项目&#xff0c;我们可以省去虚线框里面的…

java基于微信小程序的电影院购票选座 uniapp 小程序

随着移动应用技术的发展,越来越多的用户借助于移动手机、电脑完成生活中的事务,许多的传统行业也更加重视与互联网的结合,由于城镇人口的增加,人们去电影院总是排着长长的队伍,对于时间紧的人是一个非常头痛的事情,有的人可能就是排队也要用去半天时间,人们为了缓解排队就购票的…

TFT-eSPI入门使用教程

一、准备资料开发板:ESP32-S3 屏驱动是:ST7789_DRIVER 开发环境:VS Code + PlatformIO注意:以上是我使用的环境,不一定需要和是使用的东西一样,这里主要是学习TFT-eSPI开源驱 二、获取TFT-eSPI GitHub:https://github.com/Bodmer/TFT_eSPI 三、配置User_Setup.h文件 在路…

【软件与系统安全笔记】二、软件与系统安全基础

【软件与系统安全】二、软件与系统安全基础 这是《【软件与系统安全】笔记与期末复习》系列中的一篇 2022-01-17 第二次课 2022-02-21 第三次课前部分 计算机安全的目标&#xff1a; 防止信息“遭遇不测事件”, 但不能阻止“好的事情”发生&#xff08;“好的事情”包括功能性…

基于Android studio+SSH的单词记忆(背单词)APP设计

目录 引言 3 1.1. 项目介绍 3 课程设计选题《单词记忆APP》 3 1.2. 项目的目的和意义 3 1.3. 相关技术介绍 5 1.3.1. ionic angular cordova混合框架 5 1.4. 后端SSH框架 6系统需求分析 8 2.1. 软件功能 8 2.1.1. 需求分析 8 2.2. 功能性需求 9项目介绍 10 3.1. 系统的开发环…

手机上有没有跨平台轻量级的备忘录?

当你在读书时,如果想要随手记录读书笔记,那你会采取什么方式做读书笔记呢?当你在工作时,如果想要随后记录工作注意事项或常用的一些工作资料,那你会如何记录呢?相信有不少网友都会使用手机上的备忘录软件来做读书笔记,随手记事;而在电脑上会直接使用TXT或Word来记录工作…

Apple Xcode 14 (14A309) 正式版发布(含下载)

请访问原文链接&#xff1a;Apple Xcode 14&#xff0c;查看最新版。原创作品&#xff0c;转载请保留出处。 作者主页&#xff1a;www.sysin.org Xcode 14 包含了在所有 Apple 平台上开发、测试和分发 App 所需的一切资源。利用 Swift 和 SwiftUI 的易用性与强大能力以及全新…

微信抖音快手三合一壁纸小程序源码_后端管理设置功能丰富

介绍&#xff1a; 这是一款支持快手端,微信端,抖音三端的一个壁纸类型的小程序 一个后台同时管理三端,内有丰富的后端设置 安装也是特别的简单(压缩包里面也有文本安装教程) 另外支持静态壁纸显示,动态壁纸显示或者头像表情包等等 前端自适应识别所属内容然后根据内容来自…

Win11右键显示更多选项设置教程

Win11如何设置右键显示更多选项?如果你觉得每次右键菜单,都是需要点击“显示更多选项”十分麻烦,那么可以通过设置,让其直接显示出现。那么应该如何操作呢?下面小编就为大家带来具体的操作步骤,我们一起来学习下吧。Win11右键显示更多选项设置方法:1、首先用鼠标右键点击…

使用位移基本场方法对空间扩展光源进行建模

1. 摘要 利用VirtualLab Fusion的参数耦合功能可在光学设置中耦合参数。耦合的参数可重新计算系统的其他参数&#xff0c;进而自动保持系统参数间的关系。因此&#xff0c;参数耦合功能使用户可以参数设置复杂的依存关系。例如&#xff0c;在此示例中&#xff0c;我们使用参数…

234.回文链表

题目来源&#xff1a;力扣https://leetcode.cn/problems/palindrome-linked-list/solution/hui-wen-lian-biao-by-leetcode-solution/ 题目简介&#xff1a;简单的就是判断一个链表是否为回文链表 双指针 思路&#xff1a;首先就是可以想到用个双指针一个指头&#xff0c;一…

河北稳控科技DLS11 网关中继器(LTE-LoRA) 数据发送机制

河北稳控科技DLS11 网关中继器(LTE-LoRA) 数据发送机制 DLS11 是 LoRA-LTE 网关设备,专用于接收其它 LoRA 设备发来的数据包存储并在预定的时间间隔后统一发送(目前支持 VSxxx、NLM3、NLM5、NLM6 的 LoRA 数据包格式)。发送的方式有:UART、TCP、EMAIL、FTP、RF,通过设置…

高效掌握JDBC技术(三)| 三层架构理念 | 书写符合事务特性的工具类 | JUnit测试框架 | JDBC项目开发步骤

✅作者简介&#xff1a;热爱后端语言的大学生&#xff0c;CSDN内容合伙人 ✨精品专栏&#xff1a;C面向对象 &#x1f525;系列专栏&#xff1a;JDBC快速入门 文章目录1、三层架构1.1、数据访问层1.2、业务逻辑层1.2.1、组成1.3、表示层1.3.1、实现1.4、完整实现步骤2、事务及J…

Vue通知提醒框(Notification)

可自定义设置以下属性&#xff1a; 自动关闭的延时时长&#xff08;duration&#xff09;&#xff0c;单位ms&#xff0c;默认4500ms消息从顶部弹出时&#xff0c;距离顶部的位置&#xff08;top&#xff09;&#xff0c;单位像素px&#xff0c;默认24px消息从底部弹出时&…

04 访问 /staticTryFiles 或者 /staticTryFiles/ 的一些具体行为体现

前言 之前曾经做过一个测试, 测试结果如下 nginx 访问文件如果文件存在, 获取文件如果文件不存在, 文件夹存在, 获取文件夹的 index如果都不存在 响应 403/404 然后 后面更加详细的测试了一下, 梳理了一下 结论 请求 匹配到 /staticTryFiles 的时候, 查找是否有文件, 如果…