二叉树 — 给定二叉树中某个节点,返回该节点的后继节点

后继节点定义:
二叉树以中序的方式进行遍历打印,节点X的下一个节点,就是X的后继节点。
假设二叉树如下图所示:则中序遍历的后打印出来的就是 4 -> 2 -> 5 -> 1 -> 6 -> 3 -> 7。如果X = 3,则X的后继节点就是7。
在这里插入图片描述
如果Node的结构中只有left和right的话,那时间复杂度就是 O ( N ) O(N) O(N),从给定的头结点开始遍历,先打印出来中序,在遍历中序找到X,在找到X的下一个。
如果给定的Node的数据结构中包含parent指针,则可以将时间复杂度降低到 O ( K ) O(K) O(K)。K为X到后继节点的实际距离。

public static class Node {public int value;public Node left;public Node right;public Node parent;public Node(int data) {this.value = data;}}

分析:
因为中序遍历是按照 左 -> 头 -> 右的方式进行打印,所以要考虑X所处的位置。

  1. 如果X有右树,则X的后继节点一定是右树中的最左节点。
  2. 如果X没有右树,则看X是否是X.parent的left节点,如果是,则parent就是X的后继节点,如果不是,则一直向上找。直到找到当前节点是parent的左子节点为止,如果找不到,则说明X是右树最末端节点,后继节点为null。

代码实现:

 public static Node getSuccessorNode(Node node){if (node == null){return node;}if (node.right != null){return getLeftMost(node.right);}else{Node parent = node.parent;if (parent != null && node != parent.left){node = parent;parent = node.parent;}return parent;}}public static Node getLeftMost(Node node){if (node == null){return node;}while (node.left != null){node = node.left;}return node;}

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

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

相关文章

直接在Notepad++中运行GO语言-(通过NppExec插件)

前提条件: 1.建议阅读文章【直接在Notepad中运行GO语言】: 直接在Notepad中运行GO语言_go语言 notepad_西晋的no1的博客-CSDN博客 2.建议阅读文章【notepad 中安装NppExec插件】: notepad 中安装NppExec插件_西晋的no1的博客-CSDN博客 以下…

EasyCVR如何在不修改分辨率的情况下进行H.265自动转码H.264?

EasyCVR视频融合平台基于云边端一体化架构,可支持多协议、多类型设备接入,在视频能力上,平台可实现视频直播、录像、回放、检索、云存储、告警上报、语音对讲、电子地图、集群、H.265转码、智能分析以及平台级联等。 我们在此前的文章中介绍过…

微服务框架

流量入口Nginx 在上图中可以看到,Nginx作为整个架构的流量入口,可以理解为一个外部的网关,它承担着请求的路由转发、负载均衡、动静分离等功能。作为一个核心入口点,Nginx肯定要采用多节点部署,同时通过keepalived来实…

Spring 是什么框架?

对于一门技术,我们需要从为什么要学、学什么以及怎么学这三个方向入手来学习。那在说Spring这三点之前,我们先看Spring之前要学什么。 Java基础、Java语法进阶、MySQL基础操作、MySQL数据库设计和多表操作、JDBC、Maven基础、MyBatis、HMLCSS、JavaScrip…

ESP8266 RTOS SDK开发 windows开发

https://blog.csdn.net/qq_36347513/article/details/105066905 文件下载路径 https://docs.espressif.com/projects/esp8266-rtos-sdk/en/latest/get-started/windows-setup.html 下载编译环境MSYS2 下载完成后解压到根目录 双击mingw32.exe打开,ls看一下是在什么…

图书推荐管理系统Python,基于Django和协同过滤算法等实现

一、介绍 图书推荐系统 / 图书管理系统,以Python作为开发语言,基于Django实现,使用协同过滤算法实现对登录用户的图书推荐。 二、效果展示 三、演示视频 视频代码:https://www.yuque.com/ziwu/yygu3z/gq555ph49m9fvrze 四、Dj…

89C52RC普中单片机

1.静态数码管显示 数组函数 #include<regx52.h> void Delay(unsigned int xms);//带参延时函数ms /*静态数码管 P0&#xff1a;表示数码管的abcdefg dp P2.234表示位选 P21110 0011是第0号数码管 */ unsigned char NixieTable[]{0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x0…

安卓热修系列-插件资源冲突解决方案

作者&#xff1a;37手游移动客户端团队 背景 在做插件化过程中&#xff0c;宿主需要用到插件的资源&#xff0c;涉及到加载插件的资源&#xff1b; 因为插件是以apk的方式存在的&#xff0c;所以插件的ID和宿主的ID可能导致重复&#xff1b; 为了解决这个问题&#xff0c;需…

【云原生】Docker部署/容器加速器(最新版)

目录 初时Docker和部署 1.什么是Docker 2.容器和虚拟化的区别 3.部署Docker 1.卸载历史版本 2.设置存储库 3.安装Docker最新引擎 4.安装Docker特定安装引擎 1.先查看当前docker-ce都有那些版本 2.替换为所需版本&#xff0c;然后运行以下命令 要安装的命令&#xff1a; 5.启动D…

攻防世界_web

robots 题目描述是这样的&#xff0c;虽然这是一道基础题&#xff0c;但我确实还没有了解过robots协议 第一次知道是被御剑给扫描出来的后台文件 这次直接访问看看 初级题就是初级题&#xff0c;访问后得到提示&#xff0c;如果没做过我估计还不知道该咋整&#xff0c;这也是一…

Linux服务器丢包故障的解决思路及引申的TCP/IP协议栈理论

Linux服务器丢包故障的解决思路及引申的TCP/IP协议栈理论 我们使用Linux作为服务器操作系统时&#xff0c;为了达到高并发处理能力&#xff0c;充分利用机器性能&#xff0c;经常会进行一些内核参数的调整优化&#xff0c;但不合理的调整常常也会引起意想不到的其他问题&#x…

ML@集成学习@摘要

文章目录 集成学习refs摘要Note准确性和多样性 集成学习方法分类BoostingAdaBoost伪代码Adaboost小结 补充补充1补充2 BaggingBagging伪代码 特点算法效率直接应用于多分类 自助采样和包外估计随机森林 Stackingsklearn中的Stacking&#x1f388;构造初级学习器构造次级学习器 …