Java 查找二叉树中某一结点的前驱结点以及后继结点

文章目录

    • 前言
      • 什么是后继结点
      • 什么是前驱结点
    • 代码实现
      • 查找某一结点的后继结点
        • 思路
        • 代码实现
        • 图解
      • 查找某一结点的前驱结点
        • 思路
        • 代码实现
        • 图解
    • 测试用例
      • 运行结果
    • 结语

前言

给定二叉树结点定义Node结构如下,其中parent结点指向当前Node结点的父结点,根结点指向null

    private static class Node {
        public int value;
        public Node left;
        public Node right;
        /**
         * 指向父结点,头结点指向null
         */
        public Node parent;

        public Node(int value) {
            this.value = value;
        }
    }

什么是后继结点

定义:在二叉树的中序遍历的序列中,Node的下一个节点叫作Node的后继节点。

什么是前驱结点

定义:在二叉树的中序遍历的序列中,Node的前一个节点叫作Node的前驱节点。

代码实现

查找某一结点的后继结点

思路

根据中序遍历的顺序可以得出如下结论:

  1. 如果该结点存在右子树,则该结点对应的后继结点为其右子树上最左的结点;
  2. 如果该结点不存在右子树,向上查找,如果某个结点的parent结点的左子树等于该node结点,则此parent结点为后继结点

代码实现

 /**
     * 获取某个结点的后继结点
     *
     * @param node
     * @return
     */
    private static Node getSuccessorNode(Node node) {
        if (node == null) {
            return node;
        }
        if (node.right != null) {
            //1.当node结点存在右子树,则后继结点为Node结点右子树最左边结点
            return getLeftMost(node.right);
        } else {
            //当前Node结点没有右子树,则向上查找;
            //某个结点的parent结点的左子树 == node结点,则此parent结点即为后继结点
            Node parent = node.parent;
            while (parent != null && parent.left != node) {
                node = parent;
                parent = node.parent;
            }
            return parent;

        }
    }
    
   /**
     * 获取某个结点最左结点
     *
     * @param node
     * @return
     */
    private static Node getLeftMost(Node node) {
        if (node == null) {
            return node;
        }
        while (node.left != null) {
            node = node.left;
        }
        return node;
    }

图解

后继结点查找

查找某一结点的前驱结点

思路

与查找后继结点相类似,根据中序遍历顺序同样可以得出如下结论:

  1. 如果该结点存在左子树,则该结点对应的前驱结点为其左子树上最右的结点;
  2. 如果该结点不存在左子树,向上查找,如果某个结点的parent结点的右子树等于该node结点,则此parent结点为前驱结点

代码实现

    /**
     * 获取某一Node结点对应的前驱结点
     *
     * @param node
     * @return
     */
    private static Node getPrecursorNode(Node node) {
        if (node == null) {
            return node;
        }
        if (node.left != null) {
            //1.当node结点存在左子树,则前驱结点为Node结点左子树最右边结点
            return getRightMost(node.left);
        } else {
            //当前Node结点没有左子树,则向上查找;
            //某个结点的parent结点的右子树 == node结点,则此parent结点即为后继结点
            Node parent = node.parent;
            while (parent != null && parent.right != node) {
                    node = parent;
                    parent = node.parent;
            }
            return parent;
        }
    }

  /**
     * 获取某一结点最右结点
     *
     * @param node
     */
    private static Node getRightMost(Node node) {
        if (node == null) {
            return node;
        }
        while (node.right != null) {
            node = node.right;
        }
        return node;
    }

图解

查找某一结点的前驱结点

测试用例

  public static void main(String[] args) {
        Node node = new Node(1);
        node.parent = null;

        node.left = new Node(2);
        node.left.parent = node;

        node.right = new Node(3);
        node.right.parent = node;

        node.left.left = new Node(4);
        node.left.left.parent = node.left;

        node.left.right = new Node(5);
        node.left.right.parent = node.left;

        node.left.right.left = new Node(6);
        node.left.right.left.parent = node.left.right;

        node.left.right.right = new Node(7);
        node.left.right.right.parent = node.left.right;
        Node target = node.left.right.left;
        System.out.println(target.value + "的后继结点为:" + getSuccessorNode(target).value);
        System.out.println(target.value + "的前驱结点为:" +getPrecursorNode(target).value);
    }

运行结果

6的后继结点为:5
6的前驱结点为:2

结语

如果以上文章对您有一点点帮助,希望您不要吝啬的点个赞加个关注,您每一次小小的举动都是我坚持写作的不懈动力!ღ( ´・ᴗ・` )

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

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

相关文章

使用cuda报错的一次记录(CUDA error: out of memory)

原因: 由于batch_size设置过大导致的!!!

nginx页面优化与防盗链

提示:文章写完后,目录可以自动生成,如何生成可参考右边的帮助文档 文章目录 一、nginx页面优化1.版本号1.1 查看版本号1.2 修改版本号1.2.1 修改配置文件1.2.2 修改源码文件,重新编译安装 2.nginx的日志分割3.nginx的页面压缩3.1 …

ENSP模拟器如何设置命令行和描述框的背景颜色及字体

ENSP模拟器如何设置命令行和描述框的背景颜色及字体 选择“菜单 > 工具 > 选项”, 在弹出界面中选择“字体设置”。 单击“字体”后的“选择”设置字体,单击“字体颜色”后的“选择”设置字颜色,单击“背景颜色”后的“选择”设置…

【数据结构】从树到二叉树

目录 ​编辑 一. 前言 二. 树的概念及结构----凉拌海带 2.1 什么是树 2.2 树的基本术语 2.3 树的表示 2.4 树在实际生活中的应用 二. 二叉树的概念及结构----扬州炒饭 2.1 什么是二叉树 2.2 二叉树两种特殊形式 2.3 二叉树的性质 2.4 二叉树的存储结构 三. 链式二叉树基本操…

I/O模型

目录 一、I/O基本概念同步和异步阻塞和非阻塞线程在运行过程中,可能由于以下几种原因进入阻塞状态:可能阻塞套接字的Linux Sockets API调用分为以下四种 二、五种I/O模型阻塞I/O模型非阻塞式I/O模型I/O多路复用模型信号驱动式I/O模型异步I/O模型 三、五种…

On the Properties of Neural Machine Translation: Encoder–DecoderApproaches

摘要 Neural machine translation : 神经机器翻译。 神经机器翻译模型经常包含编码器和解码器:an encoder and a decoder. 编码器: 从一个变长输入序列中提取固定长度的表示。a fixed-length representation. 解码器:从表示中…

C语言图书管理系统

一,开发环境 操作系统:windows10, windows11, linux, mac等。开发工具:Qt, vscode, visual studio等开发语言:c 二,功能需求 1. 图书信息管理: 这个功能的主要任务是保存和管理图书的所有信息。这应该包…

(超级详细)如何在Mac OS上的VScode中配置OpenGL环境并编译

文章目录 安装环境下载GLAD与GLFW一、下载GLAD二、下载GLFW 项目结构配置测试程序与项目的编译测试可执行文件HelloGL 安装环境 机器:macbook air 芯片: M1芯片(arm64) macOS:macOS Ventura 13.4 VScode version&#…

天台玻璃折叠门可实现室内外空间的无缝连接

天玻璃折叠门是指安装在天台上的可折叠开合的玻璃门,可用于将室外空间与室内空间进行隔离或连接。设计天台玻璃折叠门时需要注意以下几点: 1. 结构稳固性:选择坚固、稳定的材料和结构设计,确保门体在风力和其他外力作用下不易摇晃…

HTTP第18讲——HTTP的缓存控制

诞生背景 由于链路漫长,网络时延不可控,浏览器使用 HTTP 获取资源的成本较高。所以,非常有必要把“来之不易”的数据缓存起来,下次再请求的时候尽可能地复用。这样,就可以避免多次请求 - 应答的通信成本,节…

37.RocketMQ之Broker消息存储源码分析

highlight: arduino-light 消息存储文件 rocketMQ的消息持久化在我们在搭建集群时都特意指定的文件存储路径,进入指定的store目录下就可以看到。 下面介绍各文件含义 CommitLog 存储消息的元数据。produce发出的所有消息都会顺序存入到CommitLog文件当中。 CommitLog由多个文件…

哈达玛矩阵乘法

哈达玛矩阵乘法 作者: 赵晓鹏时间限制: 1S章节: 递归与分治 输入说明 : 见问题描述。 输出说明 : 见问题描述。 输入范例 : 1 4 -6 输出范例 : -2 10 #include <iostream> #include <vector> using namespace std; vector<int>res; void cal(int len…

SpringBoot2+Vue2实战(十六)vue集成视频播放组件

修改文件上传大小限制 servlet:multipart:max-file-size: 100MBmax-request-size: 100MB Video.vue <template><div style"padding: 10px"><el-card><div v-for"item in videos" :key"item.id"style"margin: 10px 0…

8266使用巴法云OTA

为了使用方便把OTA封装一下为以下类 #include "ESP8266HTTPUpdate.h"class OTA { private:ESP8266HTTPUpdate httpUpdate;// using HTTPUpdateStartCB std::function<void()>;void OnStartCB(){Serial.println("开始OTA升级");}// using HTTPUpdat…

OpenCV图像金字塔pyrDown下采样

#include <opencv2/opencv.hpp> #include <opencv2/imgproc/imgproc.hpp>using namespace cv;int main() {// Load the original imageMat srcImage

Jina AI 受邀出席 WAIC 2023「科技无障碍」论坛,与行业专家共话 AI 普惠未来

7 月 6 日&#xff0c;2023 世界人工智能大会&#xff08;WAIC&#xff09;在上海世博中心及世博展览馆开幕&#xff0c;并在浦东张江、徐汇西岸设分会场&#xff0c;同步在闵行等产业集聚区开展同期活动。本届大会由上海市人民政府和国家发改委、工信部、科技部、国家网信办、…

【群智能算法】猎人猎物优化算法 HPO算法【Matlab代码#48】

文章目录 【获取资源请见文章第4节&#xff1a;资源获取】1. 猎人猎物优化算法&#xff08;HPO&#xff09;2. 部分代码展示3. 仿真结果展示4. 资源获取说明 【获取资源请见文章第4节&#xff1a;资源获取】 1. 猎人猎物优化算法&#xff08;HPO&#xff09; 猎人猎物优化算法…

【小沐学C++】libcurl实现HTTP/HTTPS请求

文章目录 1、简介2、下载和编译2.1 下载2.2 编译2.3 使用 3、命令行测试3.1 获取文件头Headers3.2 请求内容Request Content3.3 响应内容Response Content3.4 GET请求3.5 POST请求3.6 其他 4、代码测试3.1 simple.c3.2 url2file.c3.3 simplepost.c3.4 resolve.c3.5 progressfun…

Java语言程序设计试卷6套

目录 Java语言程序设计试卷1 一、单项选择题 二、多项选择题 三、判断题 Java语言程序设计试卷2 一、单项选择题 二、多项选择题 三、判断题 Java语言程序设计试卷3 一、单项选择题 二、多项选择题 三、判断题 Java语言程序设计试卷4 一、单项选择题 二、多项选…

PROFINET转ETHERNET/IP网关西门子通讯协议profinet

大家好&#xff0c;今天我们来聊一款令人兴奋的产品——远创智控YC-PN-EIP&#xff01;它是一款自主研发的 PROFINET 从站功能的通讯网关&#xff0c;可以将 PROFINET网络和ETHERNET/IP 网络连接起来&#xff0c;实现数据传输和交换。但这只是它的基础功能&#xff0c;它还有哪…