【剑指offer】08二叉树的下一个节点,C++实现
原创博文,转载请注明出处!
# 题目


父节点指向子节点的指针用实线表示,从子节点指向父节点的指针用虚线表示。
# 思路
- 如果节点有右子节点,则右子节点的最左节点是该节点的下一个节点。例如,寻找b的下一个节点的过程(b有右子节点e,e的左子节点是h,且h是e的最左节点,h是b的下一个节点)
- 如果节点无右子节点,但该节点是父节点的左子节点,则父节点是该节点的下一个节点。例如,寻找d的下一个节点的过程(d无右子节点,d是父节点b的左子节点,则b是de的下一个节点)
- 如果节点无右子节点,且该节点是父节点的右子节点,则沿着父节点的指针向上遍历。例如,寻找i的下一个节点的过程(i的父节点e,e是其父节点b的右子节点,节点b是其父节点a的左子节点,节点a是节点i的下一个节点)
# 代码
/*
struct TreeLinkNode {
int val;
struct TreeLinkNode *left;
struct TreeLinkNode *right;
struct TreeLinkNode *next;
TreeLinkNode(int x) :val(x), left(NULL), right(NULL), next(NULL) { }
};
*/
class Solution {
public:
TreeLinkNode* GetNext(TreeLinkNode* pNode)
{
// 特殊输入
if(pNode == nullptr)
return nullptr; /* 寻找结果 */
// 如果节点有右子节点,则右子节点的最左节点是该节点的下一个节点
// 如果节点无右子节点,但该节点是其父节点的左子节点,则父节点是该节点的下一个节点
// 如果节点无右子节点,且该节点是其父节点的右子节点,则沿着父节点向上遍历,满足XXX的父节点是其该节点的下一个节点
TreeLinkNode * res = nullptr;
if(pNode->right != nullptr)
{
TreeLinkNode* node_right = pNode->right;
while(node_right ->left != nullptr)
{
node_right = node_right->left;
}
res = node_right;
} else if(pNode->next != nullptr)
{
// 当前节点和当前节点的父节点
TreeLinkNode * current = pNode;
TreeLinkNode * parent = pNode->next; while(parent!=nullptr && current == parent->right)
{
current = parent;
parent = parent ->next;
} res = parent;
}
return res;
}
};
# 复杂度
# 测试用例
- 空节点
- 特殊二叉树(只有一个节点的二叉树、只有左子节点的二叉树、只有右子节点的二叉树、完全二叉树和不完全二叉树)
- 不同位置的节点的下一个节点(下一个节点是当前节点右子节点、右子树的最左子节点、父节点、跨层父节点、无下一个节点)
【剑指offer】08二叉树的下一个节点,C++实现的更多相关文章
- 剑指offer——06二叉树的下一个节点
题目描述 给定一个二叉树和其中的一个结点,请找出中序遍历顺序的下一个结点并且返回.注意,树中的结点不仅包含左右子结点,同时包含指向父结点的指针. 题目的意思是,在一颗二叉树的中序遍历中,给出其中一 ...
- 【剑指Offer】二叉树的下一个结点 解题报告(Python)
[剑指Offer]二叉树的下一个结点 解题报告(Python) 标签(空格分隔): 剑指Offer 题目地址:https://www.nowcoder.com/ta/coding-interviews ...
- Go语言实现:【剑指offer】二叉树的下一个结点
该题目来源于牛客网<剑指offer>专题. 给定一个二叉树和其中的一个结点,请找出中序遍历顺序的下一个结点并且返回. 注意,树中的结点不仅包含左右子结点,同时包含指向父结点的指针. Go语 ...
- 【Java】 剑指offer(7) 二叉树的下一个结点
本文参考自<剑指offer>一书,代码采用Java语言. 更多:<剑指Offer>Java实现合集 题目 给定一棵二叉树和其中的一个结点,如何找出中序遍历顺序的下一个结点? ...
- 剑指Offer 57. 二叉树的下一个结点 (二叉树)
题目描述 给定一个二叉树和其中的一个结点,请找出中序遍历顺序的下一个结点并且返回.注意,树中的结点不仅包含左右子结点,同时包含指向父结点的指针. 题目地址 https://www.nowcoder.c ...
- [剑指Offer] 57.二叉树的下一个结点
题目描述 给定一个二叉树和其中的一个结点,请找出中序遍历顺序的下一个结点并且返回.注意,树中的结点不仅包含左右子结点,同时包含指向父结点的指针. /* struct TreeLinkNode { in ...
- [剑指Offer]8-二叉树的下一个节点
链接 https://www.nowcoder.com/practice/9023a0c988684a53960365b889ceaf5e?tpId=13&tqId=11210&tPa ...
- 【剑指 Offer】08.二叉树的下一个节点
题目描述 给定一颗二叉树和其中的一个节点,找出中序遍历序列的下一个节点.树中的节点除了有两个分别指向左右节点的指针,还有一个指向父节点的指针. Java public class Solution08 ...
- 剑指offer57:二叉树的下一个结点
1 题目描述 给定一个二叉树和其中的一个结点,请找出中序遍历顺序的下一个结点并且返回.注意,树中的结点不仅包含左右子结点,同时包含指向父结点的指针. 2 思路和方法 中序遍历,下一个结点有两种情况 a ...
随机推荐
- 2017 ACM/ICPC 南宁区 网络赛 Overlapping Rectangles
2017-09-24 20:11:21 writer:pprp 找到的大神的代码,直接过了 采用了扫描线+线段树的算法,先码了,作为模板也不错啊 题目链接:https://nanti.jisuanke ...
- nignx的master进程和worker进程的作用
ngnix进程启动启动后会有一个master进程和多个worker进程. master进程的主要作用: 1.读取并验证配置信息: 2.创建,绑定及关闭套接字: 3.启动,终止worker进程以及维护w ...
- MySQL Order By Rand()效率分析
最近研究了一下MYSQL的随机抽取实现方法.举个例子,要从tablename表中随机提取一条记录,大家一般的写法就是:SELECT * FROM tablename ORDER BY RAND() L ...
- PHP 7.3.0.beta3 发布,下个版本将进入 RC 阶段
PHP 7.3.0 第三个测试版 beta3 已发布,源码下载地址 >>> https://downloads.php.net/~cmb/ 更新内容如下: - Core: . Fix ...
- Python实现H5页面
from selenium import webdriver mobile_emulation = {'deviceName':'iPhone X'} options = webdriver.Chro ...
- nmcli 使用记录---fatt
安装nmcli工具 yum install NetworkManager 使用语法 Usage: nmcli [OPTIONS] OBJECT { COMMAND | help } OBJECT g[ ...
- 在线修改Schema
1. mysql5.5 或者 Mariadb 5.5 之前不需要将数据表中的所有记录复制到临时数据表的操作: a. 修改列名 b. 修改数值类型表示的长度(由INT(2)变成INT(3 ...
- vue的slot的使用问题
slot的使用问题 根据官方文档来说,有三种使用方式 https://cn.vuejs.org/v2/guide/components.html#%E4%BD%BF%E7%94%A8%E6%8F%92 ...
- 转:kafka入门
一.基本概念 介绍 Kafka是一个分布式的.可分区的.可复制的消息系统.它提供了普通消息系统的功能,但具有自己独特的设计. 这个独特的设计是什么样的呢? 首先让我们看几个基本的消息系统术语:Kafk ...
- 网页重构中区分IE6、IE7、IE8及标准浏览器的最佳方法
由于万恶的IE6和IE7,我们在页面重构时不免要对其进行各种bug修复及差异化处理.在标准浏览器中可实现的效果在IE里却有各种离奇问题,例如IE6.IE7不能良好应对的inline-block和.cl ...