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

【LeetCode】剑指 Offer 08. 二叉树的下一个节点 p65 -- Java Version

题目链接:无题目链接,不知道为啥力扣上找不到这一题。

1. 题目介绍(08. 二叉树的下一个节点)

题目:给定一个二叉树和其中的一个节点,请找出中序遍历顺序的下一个节点并且返回。注意,树中的节点除了有两个分别指向左、右子节点的指针,还要一个指向父节点的指针。

【测试用例】:
示例1:(一颗有9个节点的二叉树。树中从父节点指向子节点的指针用实线表示,从子节点指向父节点的指针用虚线表示)
在这里插入图片描述

中序遍历序列 {d,b,h,e,i,a,f,c,g}

  • a的下一节点为f
  • b的下一节点为h

2. 题解

2.1 讨论3种情况 – O(n)

package com.thomas.offer;public class Offer08_BinaryTreeNext {// 定义二叉树节点结构public static class TreeNode {private String val;private TreeNode left;private TreeNode right;private TreeNode parent;public TreeNode(String val) {this.val = val;}@Overridepublic String toString() {return val + "";}}/*3种情况:1. 当前节点有右子树,那么Next就是其右子树的最左子节点2. 当前节点无右子树,如果该节点是父节点的左子节点,那么Next就是其父节点3. 当前节点无右子树,如果该节点是父节点的右子节点,那么从其父节点开始向上查找,直到找到其父节点是左子节点的父节点,那么Next就是该父节点* */public static TreeNode nextNode(TreeNode node) {// 1. 判空操作if (node == null) return null;// 2. 第一种情况,节点有右子树,Next为其右子树的最左子节点if (node.right != null) {node = node.right;while (node.left != null) {node = node.left;}return node;}// 3. 第二种情况,节点无右子树,且该节点为其父节点的左子节点,Next为其父节点if (node == node.parent.left) return node.parent;// 4. 第三种情况:节点无右子树,且该节点为其父节点的右子节点,Next是一个父节点 (Xxx父节点是该父节点的左子节点)if (node == node.parent.right) {// 循环结束条件:node == node.parent.left,// 即找到了其父节点是左子节点的父节点node = node.parent;while (node != node.parent.left) {node = node.parent;// 注意:最右节点也属于该情况,但它无法满足循环结束条件,在这里我们判断一下,返回null即可if (node.parent == null) {return null;}}return node.parent;}return null;}// 建树public static void createTree(TreeNode node,TreeNode left,TreeNode right,TreeNode parent) {node.left = left;node.right = right;node.parent = parent;}public static void main(String[] args) {// 1。 创建二叉树节点对象TreeNode a = new TreeNode("a");TreeNode b = new TreeNode("b");TreeNode c = new TreeNode("c");TreeNode d = new TreeNode("d");TreeNode e = new TreeNode("e");TreeNode f = new TreeNode("f");TreeNode g = new TreeNode("g");TreeNode h = new TreeNode("h");TreeNode i = new TreeNode("i");// 二叉树中序遍历 {d,b,h,e,i,a,f,c,g}// 2. 构造二叉树createTree(a, b, c, null);createTree(b, d, e, a);createTree(c, f, g, a);createTree(d, null, null, b);createTree(e, h, i, b);createTree(f, null, null, c);createTree(g, null, null, c);createTree(h, null, null, e);createTree(i, null, null, e);// 3. 调用nextNode方法,打印结果System.out.println(nextNode(a));  // fSystem.out.println(nextNode(b));  // hSystem.out.println(nextNode(c));  // gSystem.out.println(nextNode(d));  // bSystem.out.println(nextNode(e));  // iSystem.out.println(nextNode(f));  // cSystem.out.println(nextNode(g));  // nullSystem.out.println(nextNode(h));  // eSystem.out.println(nextNode(i));  // a}}

在这里插入图片描述

3. 思考

找中序遍历二叉树的下一个节点,主要就分为三种情况:

  1. 当前节点有右子树,那么Next就是其右子树的最左子节点;
  2. 当前节点无右子树,如果该节点是父节点的左子节点,那么Next就是其父节点;
  3. 当前节点无右子树,如果该节点是父节点的右子节点,那么从其父节点开始向上查找,直到找到其父节点是左子节点的父节点,那么Next就是该父节点。

4. 可参考资料

[1] 大神整理的剑指Offer【所有面试题汇总】
[2] 【剑指Offer学习】【面试题58:二叉树的下一个结点】(代码结构参考)

相关文章:

【LeetCode】剑指 Offer 08. 二叉树的下一个节点 p65 -- Java Version

题目链接:无题目链接,不知道为啥力扣上找不到这一题。 1. 题目介绍(08. 二叉树的下一个节点) 题目:给定一个二叉树和其中的一个节点,请找出中序遍历顺序的下一个节点并且返回。注意,树中的节点…...

Python 之 Pandas Series 数据结构

文章目录一、Series 结构二、数据结构 Series 创建1. 创建1.1 列表/数组作为数据源创建 Series1.2 字典作为数据源创建 Series1.3 通过标量创建2. 参数说明2.1 index 参数2.2 name 参数2.3 copy 参数三、Series 的索引/切片1. 下标索引2. 标签索引3. 切片四、Series 数据结构的…...

【java基础】Java常用类———包装类

包装类 wrapper 装箱与拆箱 装箱&#xff1a;基本类型->包装类&#xff1b; 拆箱&#xff1a; 包装类->基本类型 public class Integer01 {public static void main(String[] args) {//演示int <--> Integer 的装箱和拆箱//jdk5前是手动装箱和拆箱//手动装箱 in…...

linux shell 入门学习笔记3 shebang

shebang 计算机程序中&#xff0c;shebang指的是出现在文本文件的第一行前两个字符#! 在Unix系统中&#xff0c;程序会分析shebang后面的内容&#xff0c;作为解释器的指令&#xff0c;例如 以#!/bin/sh 开头的文件&#xff0c;程序在执行的时候会调用/bin/sh&#xff0c;也就…...

写作小课堂:简历模版【A4纸正反两面】(20230219)

文章目录 I 联系方式II 个人信息III 求职意向IV 工作经验2018年-11月-至今全城淘信息技术服务有限公司2017年07月-2018年-11月湖南微流网络科技有限公司2014年06月-2017年07月湖南高阳通联信息技术有限公司V 项目经验2018年11月-至今全城淘淘管家2017年10月-2018年11月ASO(机刷…...

一文搞懂 DevOps

前言 DevOps作为一个热门的概念&#xff0c;近年来频频出现在各大技术社区和媒体的文章中&#xff0c;备受行业大咖的追捧&#xff0c;也吸引了很多吃瓜群众的围观。 那么&#xff0c;DevOps是什么呢&#xff1f; 有人说它是一种方法&#xff0c;也有人说它是一种工具&#…...

深入讲解Kubernetes架构-租约

分布式系统通常需要租约&#xff08;Lease&#xff09;&#xff1b;租约提供了一种机制来锁定共享资源并协调集合成员之间的活动。 在 Kubernetes 中&#xff0c;租约概念表示为 coordination.k8s.io API 组中的 Lease 对象&#xff0c; 常用于类似节点心跳和组件级领导者选举等…...

微信小程序学习第11天——Vant Weapp组件库、API Promise化、全局数据共享Mobx、分包

目录一、小程序对npm 的限制二、使用Vant Weapp组件库1、安装组件2、使用组件3、定制全局样式三、API Promise化1、下载miniprogram-api-promise2、引入3、使用四、全局数据共享五、分包1、分包概念2、使用分包3、独立分包4、分包预下载一、小程序对npm 的限制 在小程序中使用…...

Python3-基本数据类型

Python3 基本数据类型 Python 中的变量不需要声明。每个变量在使用前都必须赋值&#xff0c;变量赋值以后该变量才会被创建。 在 Python 中&#xff0c;变量就是变量&#xff0c;它没有类型&#xff0c;我们所说的"类型"是变量所指的内存中对象的类型。 等号&…...

RPA落地指南:什么是RPA

什么是RPA RPA在企业中起什么作用并扮演什么角色呢&#xff1f;想要充分了解RPA&#xff0c;我们需要知道RPA的相关概念、特点、功能以及能解决的问题。接下来对这些内容进行详细介绍。 1.1 RPA的3个核心概念 RPA的中文译名是“机器人流程自动化”&#xff0c;顾名思义&…...

跨域问题的三种解决办法

我们平时对于前后端联调的项目&#xff0c;以下的错误是经常常见的&#xff0c;我们查看浏览器报错&#xff1a; Access to XMLHttpRequest at http://localhost:63110/system/dictionary/all fromorigin http://localhost:8601 has been blocked by CORS policy: No Access…...

c++提高篇——string容器

一、string基本概念 string是C风格的字符串&#xff0c;而string本质上是一个类。 与c语言不同&#xff0c;string是一个类&#xff0c;类内部封装了char*&#xff0c;管理这个字符串&#xff0c;是一个char型的容器。在根本上与c语言字符串是一致的。 在string类内部封装了很…...

[软件工程导论(第六版)]第6章 详细设计(复习笔记)

文章目录6.1 结构程序设计6.2 人机界面设计6.3 过程设计的工具6.3.1 程序流程图&#xff08;程序框图&#xff09;6.3.2 盒图&#xff08;N-S图&#xff09;6.3.3 PAD图&#xff08;问题分析图&#xff09;6.3.4 判定表6.3.5 判断树6.3.6 过程设计语言6.4 面向数据结构的设计方…...

RabbitMQ核心内容:实战教程(java)

文章目录一、安装二、入门1.分类2.核心概念3.工作原理4.六大模式三、模式一&#xff1a;"Hello World!"1.依赖2.生产者代码3.消费者代码四、模式二&#xff1a;Work Queues1.工作原理2.工具类代码&#xff1a;连接工厂3.消费者代码4.生产者代码5.分发策略不公平分发预…...

RK356x U-Boot研究所(命令篇)3.7 pci与nvme命令的用法

平台U-Boot 版本Linux SDK 版本RK356x2017.09v1.2.3文章目录 一、设备树与config配置二、pci命令的定义三、nvme命令的定义四、pci与nvme命令的用法3.1 pci总线扫描3.2 nvme设备信息3.3 nvme设备读写一、设备树与config配置 RK3568支持PCIe接口,例如ROC-RK3568-PC: 原理图如…...

微信头像昵称获取能力的变化导致了我半年没更新小程序

背景 2022年9月份&#xff0c;微信更改了获取头像昵称的规则&#xff0c;回收了原有 wx.getUserProfile 中的部分能力&#xff0c;为了减小对【微点记账】小程序的影响&#xff0c;长达半年未做任何更新&#xff0c;今天为了增加这个聊天机器人的功能&#xff0c;不得不重新查…...

【深度学习编译器系列】1. 为什么需要深度学习编译器?

本系列是自学深度学习编译器过程中的一些笔记和总结&#xff0c;参考文献在文末。 1. 概述 深度学习&#xff08;DL&#xff09;编译器的产生有两方面的因素&#xff1a;深度学习模型的广泛应用&#xff0c;以及深度学习芯片的层出不穷。 一方面&#xff0c;我们现在有非常多…...

数据结构与算法总结整理(超级全的哦!)

数据结构与算法基础大O表示法时间复杂度大O表示法时间复杂度排序&#xff1a;最坏时间复杂度时间复杂度的几条基本计算规则内存工作原理什么是内存内存主要分为三种存储器随机存储器&#xff08;RAM&#xff09;只读存储器&#xff08;ROM&#xff09;高速缓存&#xff08;Cach…...

DPDK — MALLOC 堆内存管理组件

目录 文章目录 目录MALLOC 堆内存管理组件rte_malloc() 接口malloc_heap 结构体malloc_elem 结构体内存初始化流程内存申请流程内存释放流程MALLOC 堆内存管理组件 MALLOC(堆内存管理组件)基于 hugetlbfs 内核文件系统来实现,能够从 HugePage 中分配一块连续的物理大页内存…...

分享113个HTML艺术时尚模板,总有一款适合您

分享113个HTML艺术时尚模板&#xff0c;总有一款适合您 113个HTML艺术时尚模板下载链接&#xff1a;https://pan.baidu.com/s/1ReoPNIRjkYov-SjsPo0vhg?pwdjk4a 提取码&#xff1a;jk4a Python采集代码下载链接&#xff1a;采集代码.zip - 蓝奏云 女性化妆用品网页模板 粉…...

Python60日基础学习打卡Day45

之前的神经网络训练中&#xff0c;为了帮助理解借用了很多的组件&#xff0c;比如训练进度条、可视化的loss下降曲线、权重分布图&#xff0c;运行结束后还可以查看单张图的推理效果。 如果现在有一个交互工具可以很简单的通过按钮完成这些辅助功能那就好了&#xff0c;他就是…...

玄机-日志分析-IIS日志分析

1.phpstudy-2018站点日志.(.log文件)所在路径&#xff0c;提供绝对路径 2.系统web日志中状态码为200请求的数量是多少 3.系统web日志中出现了多少种请求方法 4.存在文件上传漏洞的路径是什么(flag{/xxxxx/xxxxx/xxxxxx.xxx} 5.攻击者上传并且利用成功的webshell的文件名是什…...

制作个人Github学术主页

1.fork一个模板 从模板网站Jekyll Themes fork一个模板&#xff0c;并在repository name里填入yourname.github.io 2.生成自己的site 按顺序点击以下按钮&#xff0c;修改Branch为master /root 然后点击save &#xff0c;等待一会后刷新&#xff0c;便会生成一个新的site。 3.…...

ABP VNext 与 Neo4j:构建基于图数据库的高效关系查询

ABP VNext 与 Neo4j&#xff1a;构建基于图数据库的高效关系查询 &#x1f680; 在社交网络、权限图谱、推荐系统等应用场景中&#xff0c;关系链深度和复杂度远超传统关系型数据库的表达能力。本文基于 ABP VNext 框架&#xff0c;集成 Neo4j 图数据库&#xff0c;构建一套高…...

Dify工具插件开发和智能体开发全流程

想象一下&#xff0c;你正在开发一个 AI 聊天机器人&#xff0c;想让它能实时搜索 Google、生成图像&#xff0c;甚至自动规划任务&#xff0c;但手动集成这些功能耗时又复杂。Dify 来了&#xff01;这个开源的 AI 应用平台让你轻松开发工具插件和智能体策略插件&#xff0c;快…...

多分辨率 LCD 的 GUI 架构设计与实现

1.1多分辨率显示系统的挑战与解决方案 1.1.1 分辨率适配的核心问题 在嵌入式系统中,同时支持不同分辨率的 LCD(如 240160、320480 等)面临以下挑战: 布局适配:同一界面元素在不同分辨率下需要调整大小和位置 字体显示:小分辨率屏幕需要更小的字体,而大分辨率需要更清…...

JavaSec-SPEL - 表达式注入

简介 SPEL(Spring Expression Language)&#xff1a;SPEL是Spring表达式语言&#xff0c;允许在运行时动态查询和操作对象属性、调用方法等&#xff0c;类似于Struts2中的OGNL表达式。当参数未经过滤时&#xff0c;攻击者可以注入恶意的SPEL表达式&#xff0c;从而执行任意代码…...

centos中的ulimit命令

centos中的ulimit命令 ulimit的作用CENTOS系统文件配置配置文件地址配置格式 配置方法 ulimit的作用 ulimit用于限制shell启动进程所占用的资源&#xff0c;支持以下各种类型的限制&#xff1a;所创建的内核文件的大小、进程数据块的大小、Shell进程创建文件的大小、内存锁住的…...

软考 系统架构设计师系列知识点之杂项集萃(84)

接前一篇文章&#xff1a;软考 系统架构设计师系列知识点之杂项集萃&#xff08;83&#xff09; 第151题 在软件系统工具中&#xff0c;版本控制工具属于&#xff08;&#xff09;&#xff0c;软件评价工具属于&#xff08;&#xff09;。 第1空 A. 软件开发工具 B. 软件维…...

DAY43打卡

浙大疏锦行 kaggle找到一个图像数据集&#xff0c;用cnn网络进行训练并且用grad-cam做可视化 进阶&#xff1a;并拆分成多个文件 fruit_cnn_project/ ├─ data/ # 存放数据集&#xff08;需手动创建&#xff0c;后续放入图片&#xff09; │ ├─ train/ …...