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

news2024/11/15 11:15:10

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

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;
        }

        @Override
        public 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));  // f
        System.out.println(nextNode(b));  // h
        System.out.println(nextNode(c));  // g
        System.out.println(nextNode(d));  // b
        System.out.println(nextNode(e));  // i
        System.out.println(nextNode(f));  // c
        System.out.println(nextNode(g));  // null
        System.out.println(nextNode(h));  // e
        System.out.println(nextNode(i));  // a
    }

}

在这里插入图片描述

3. 思考

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

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

4. 可参考资料

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

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

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

linux线程阻塞中CPU的占用率

linux线程阻塞中CPU的占用率 一、简介 总所周知Linux系统下,我们编写的程序进入阻塞后,系统把任务挂起,交给内核进行处理,此时我们的进程CPU占用率不高,可以说是占用率0.0%,让CPU资源交给其他进程处理&am…

【算法】三道算法题目单词拆分,填充每个节点的下一个右侧节点指针以及组合总和

算法第一道算法题:单词拆分java解答参考第二道算法题:填充每个节点的下一个右侧节点指针java 解答参考第三道算法题:组合总和java解答参考大家好,我是小冷。 今天还是继续学习算法技术知识吧 第一道算法题:单词拆分 …

Docker - 镜像操作命令

镜像名称一般分为两部分组成:[repository]:[tag]在没有指定tag时,默认是latest,代表最新版本的镜像1.下载docker镜像 docker pull repository:tag2.查看本地所有镜像 docker images3.创建镜像别名 docker tag repository:tag repository111:tag4.查看镜像…

java面试题-集合篇

Collection1.Collection有哪些类?Java集合框架中的Collection接口是所有集合类的基础接口,定义了一些基本的集合操作,如添加元素、删除元素、判断是否包含某个元素等。常见的集合类包括List、Set和Queue。ListList接口定义了按照索引访问和操…

Module理解及使用

ES6的模块化设计思想是静态化,也就是说,在编译的时候确定模块的依赖关系,以及输出输出入的变量。而CommonJS和AMD模块都是在运行时确定的。ES6的模块不是对象,而是通过export显示指定输出的代码,再通过import命令输入。…

ES6新特性详解

文章目录1. let和const1.1 let声明变量1.2 const声明常量2. 模板字符串3. 解构赋值3.1 数组的解构赋值3.2 对象的解构赋值4. 函数扩展4.1 参数默认值4.2 剩余参数4.3 箭头函数5. 对象扩展5.1 对象简写5.2 属性名表达式5.3 扩展运算符6. Symbol7. Iterator和Generator7.1 Iterat…

k8s自动化安装脚本(kubeadm-1.23.7)

文章目录介绍软件架构版本介绍更新内容2023-02-192023-02-152023-02-142023-02-102022-10-202022-08-06准备部署包操作步骤环境准备结构备注解压部署包修改host文件脚本使用方式初始化环境验证ansible配置安装k8s集群登录master的节点添加node节点master节点状态检查组件安装安…

高精度算法一

目录 1. 基础知识 2. 大整数 大整数 3. 大整数 - 大整数 1. 基础知识 利用计算机进行数值计算,有时会遇到这样的问题:有些计算要求精度高,希望计算的数的位数可达几十位甚至几百位,虽然计算机的计算精度也算较高了&#xff0c…

大数据之---Nifi-处理器类别_详细了解各种处理器的含义用途---大数据之Nifi工作笔记0007

处理器有很多类这里主要分了,数据转换的可以看到上面的这些是数据转换常用的 然后: 这里这个controlrate,用来控制流的速率,来保护作用,防止崩掉 distributeLoad用来负载均衡,减轻压力 这里的路由是,根据是否满足对应的条件,来执行是否把数据路由到某个地方. 然后来看数据库…

数据库技术-函数依赖、键与约束、范式

一、函数依赖 给定一个x,能唯一确定一个Y,就称x确定Y,或者说Y依赖于x,例如YX*X函数。 函数依赖又可扩展以下两种规则: 部分函数依赖:A可确定C,(A,B)也可确定C,(A,B)中的一部分(即A)可以确定C&a…

Spring Cloud Nacos实战(一)- 下载和安装

Spring Cloud Alibaba Nacos下载和安装 Nacos介绍 ​ Nacos(Naming Configuration Service) 是一个易于使用的动态服务发现、配置和服务管理平台,用于构建云原生应用程序 ​ 服务发现是微服务架构中的关键组件之一。Nacos 致力于帮助您发现…

使用nginx单独部署Vben应用

前言 本文主要介绍Vben使用nginx单独部署的方式,其实前端发展到现在已经不是当年的jsp,asp必须要和后端一起部署了。单独部署调试的工具也很多,比如vue-cli-service 和 Vben中用到的vite ,当然这些我们一般用在开发的工程中。正式…

SpringCloud(三)Hystrix断路器服务降级、服务熔断、服务监控案例详解

七、Hystrix断路器 7.1 简介 分布式系统面临的问题 复杂分布式体系结构中的应用程序有数十个依赖关系,每个依赖关系在某些时候将不可避免地失败。 多个微服务之间调用的时候,假设微服务A调用微服务B和微服务C,微服务B和微服务C又调用其它的微…

C# chart绘图 鼠标响应

1、图形自动滚动设置 chart1.ChartAreas[0].AxisX.Maximum 横坐标显示区域最大值 chart1.ChartAreas[0].AxisX.Minimum 横坐标显示区域最小值 显示宽度 chart1.ChartAreas[0].AxisX.Maximum - chart1.ChartAreas[0].AxisX.Minimum chart1.ChartAreas[0].AxisX.Maximum x_d…

ChatGPT从业影响之个人浅见

文章目录前言ChatGPT简介AI简介ChatGPT对从业者的影响参考资料前言 ChatGRT最近很火,网上有一些观点,他会取代很多职业,让产业产生颠覆性的变化。今天聊聊自己的想法,他的出现,是否会让我(程序员&#xff…

qmt api 接口文档

http://qmt.ptradeapi.com 用户自行安装 Python 三方库 对于有经验的 Python 开发者来说,平台提供了自行安装第三方库的方式。为了引入额外的第三方库,用户需要做如下一些操作: 安装前注意事项: 三方库的安装有可能会引起系统错误…

JVM学习篇对象创建与内存分配机制深度剖析

1. 对象的创建 对象创建的主要流程: 1.1 类加载检查 虚拟机遇到一条new指令时,首先将去检查这个指令的参数是否能在常量池中定位到一个类的符号引用,并且检查这个符号引用代表的类是否已被加载、解析和初始化过。如果没有,那必须先执行相…

【Java 面试合集】内存中为什么要区分栈和堆

内存中为什么要区分栈和堆 1. 概述 嗨,大家好Java 面试合集又来了,今天我们分享的主题很大众化以及普通。无论是Java 语言本身还是别的语言都会有所涉及,但是今天我们从Java角度来讲下 2. 分析 今天我们会从多个方向来分享这个话题 2.1 栈是…

ETCD本地多成员集群部署

目录安装部署etcdctl 操作etcd使用http请求操作etcd本地多成员集群搭建python获取成员信息参考安装部署 按照官网文档,安装release版本 https://etcd.io/docs/v3.4/install/ [rootVM-33-162-centos /usr/local/bin]# etcd --version etcd Version: 3.4.16 Git SH…

点云配准方法原理(NDT、ICP)

配准是点云处理中的一个基础问题,众多学者此问题进行了广泛而深入的研究,也出现了一系列优秀成熟的算法,在三维建模、自动驾驶等领域发挥着重要的作用。 本文主要介绍粗配准NDT (Normal Distribution Transform) 与 精配准ICP (Iterative Cl…