剑指offer:JZ8 二叉树的下一个结点
JZ8 二叉树的下一个结点
描述
给定一个二叉树其中的一个结点,请找出中序遍历顺序的下一个结点并且返回。注意,树中的结点不仅包含左右子结点,同时包含指向父结点的next指针。下图为一棵有9个节点的二叉树。树中从父节点指向子节点的指针用实线表示,从子节点指向父节点的用虚线表示
示例:
输入:{8,6,10,5,7,9,11},8
返回:9
解析:这个组装传入的子树根节点,其实就是整颗树,中序遍历{5,6,7,8,9,10,11},根节点8的下一个节点就是9,应该返回{9,10,11},后台只打印子树的下一个节点,所以只会打印9,如下图,其实都有指向左右孩子的指针,还有指向父节点的指针,下图没有画出来
分析
初拿到这道题,很明显看出是一个二叉树的中序遍历就可以解决的问题,但是仔细看了题目之后,发现,题目会给两个参数,而这两个参数组装成的是一个二叉树节点(可以是其中树的任意节点),这样的话,如果使用普通的遍历方法直接做,就会有问题,需要多一步遍历这个节点的next找到整棵树的根节点,之后使用dfs进行中序遍历得到结果。
代码
/**
* JZ8 二叉树的下一个结点
* @param pNode
* @return
*/
public TreeLinkNode GetNext(TreeLinkNode pNode) {
//提出题目中要求对比的值
Integer value = pNode.val;
//通过不断的寻找next找到整棵树的根节点
while (pNode.next != null) {
pNode = pNode.next;
}
//结果队列
Queue<TreeLinkNode> queue = new LinkedList<>();
//dfs遍历使用的栈,储存没有遍历过的节点用
Stack<PosNode> treeStack = new Stack<>();
//根节点
PosNode rootNode = new PosNode(pNode);
//根节点加入栈
treeStack.push(rootNode);
//如果所有节点都已经遍历过就跳出循环
while (treeStack.size() > 0) {
//中序遍历,先遍历左子树
if (treeStack.peek().node.left != null && treeStack.peek().visitLeft == false) {
PosNode posNode = new PosNode(treeStack.peek().node.left);
//证明左子树访问过
treeStack.peek().visitLeft = true;
treeStack.push(posNode);
}else {
//把节点值值存储在结果队列中
queue.offer(treeStack.peek().node);
//证明左子树访问过
treeStack.peek().visitLeft = true;
//开始遍历右子树
if (treeStack.peek().node.right != null && treeStack.peek().isVisitRight == false) {
PosNode posNode = new PosNode(treeStack.peek().node.right);
treeStack.peek().isVisitRight = true;
treeStack.push(posNode);
}else {
//如果右子树也遍历过或者为空的话
treeStack.peek().isVisitRight = true;
//通过出栈寻找左右子树都没有遍历过的节点
while (treeStack.size() != 0 && treeStack.peek().isVisitRight == true && treeStack.peek().visitLeft == true)
treeStack.pop();
}
}
}
//存储的中序遍历结果进行值的比较找出结果
while (queue.size() != 0) {
if (queue.peek().val != value) {
queue.poll();
}else {
queue.poll();
return queue.peek();
}
}
//找不到的话返回空值
return null;
}
/**
* 保存节点以及记录节点的左右子树是否访问过的表质量
*/
class PosNode{
TreeLinkNode node;
boolean visitLeft = false;
boolean isVisitRight = false;
PosNode(TreeLinkNode node) {
this.node = node;
}
}
总结
需要熟练使用代码来遍历二叉树,本人的方法使用内存占用较高,后续可以去除结果队列,直接在遍历中使用标志量记录结果返回。
剑指offer:JZ8 二叉树的下一个结点的更多相关文章
- 【剑指Offer】二叉树的下一个结点 解题报告(Python)
[剑指Offer]二叉树的下一个结点 解题报告(Python) 标签(空格分隔): 剑指Offer 题目地址:https://www.nowcoder.com/ta/coding-interviews ...
- 【Java】 剑指offer(7) 二叉树的下一个结点
本文参考自<剑指offer>一书,代码采用Java语言. 更多:<剑指Offer>Java实现合集 题目 给定一棵二叉树和其中的一个结点,如何找出中序遍历顺序的下一个结点? ...
- Go语言实现:【剑指offer】二叉树的下一个结点
该题目来源于牛客网<剑指offer>专题. 给定一个二叉树和其中的一个结点,请找出中序遍历顺序的下一个结点并且返回. 注意,树中的结点不仅包含左右子结点,同时包含指向父结点的指针. Go语 ...
- 剑指Offer 57. 二叉树的下一个结点 (二叉树)
题目描述 给定一个二叉树和其中的一个结点,请找出中序遍历顺序的下一个结点并且返回.注意,树中的结点不仅包含左右子结点,同时包含指向父结点的指针. 题目地址 https://www.nowcoder.c ...
- [剑指Offer] 57.二叉树的下一个结点
题目描述 给定一个二叉树和其中的一个结点,请找出中序遍历顺序的下一个结点并且返回.注意,树中的结点不仅包含左右子结点,同时包含指向父结点的指针. /* struct TreeLinkNode { in ...
- 剑指offer——06二叉树的下一个节点
题目描述 给定一个二叉树和其中的一个结点,请找出中序遍历顺序的下一个结点并且返回.注意,树中的结点不仅包含左右子结点,同时包含指向父结点的指针. 题目的意思是,在一颗二叉树的中序遍历中,给出其中一 ...
- 剑指offer57:二叉树的下一个结点
1 题目描述 给定一个二叉树和其中的一个结点,请找出中序遍历顺序的下一个结点并且返回.注意,树中的结点不仅包含左右子结点,同时包含指向父结点的指针. 2 思路和方法 中序遍历,下一个结点有两种情况 a ...
- [剑指Offer]8-二叉树的下一个节点
链接 https://www.nowcoder.com/practice/9023a0c988684a53960365b889ceaf5e?tpId=13&tqId=11210&tPa ...
- 【剑指offer】面试题 8. 二叉树的下一个结点
面试题 8. 二叉树的下一个结点 NowCoder 题目描述 给定一棵二叉树和其中的一个结点,如何找出中序遍历顺序的下一个结点?树中的结点除了有两个分别指向左右子结点的指针以外,还有一个指向父结点的指 ...
随机推荐
- Mysql - You can't specify target table '表名' for update in FROM clause 错误解决办法
背景 在MySQL中,写SQL语句的时候 ,可能会遇到 You can't specify target table '表名' for update in FROM clause 这样的错误 错误含义 ...
- TCP可靠传输原理
停止等待协议 "停止等待"就是发送方在发送完一个分组后停止发送,等待接收方的确认后再继续发送. 超时重传 发送方在等待一定时间后如果还没有收到接收方的确认,此时发送方将认定分组没有 ...
- Hash值和位运算
一.Hash 1.md5是hash算法,不可逆,还原的是暴力穷举的方式解析的:加盐之后穷举也不能还原: 2.压缩映射会有重复,即哈希冲突: 二.ConcurrentHashMap 1.putIfAbs ...
- 安装docker遇到:package docker-ce-3:19.03.8-3.el7.x86_64 requires containerd.io >= 1.2.2-3, but none of the providers can be installed
执行 yum install docker-ce docker-ce-cli containerd.io 提示: 错误: 问题: package docker-ce-3:19.03.8-3.el7.x ...
- 【PHP数据结构】其它排序:简单选择、桶排序
这是我们算法正式文章系列的最后一篇文章了,关于排序的知识我们学习了很多,包括常见的冒泡和快排,也学习过了不太常见的简单插入和希尔排序.既然今天这是最后一篇文章,也是排序相关的最后一篇,那我们就来轻松一 ...
- nginx 禁止某IP访问
首先建立下面的配置文件放在nginx的conf目录下面,命名为blocksip.conf: deny 95.105.25.181; 保存一下. 在nginx的配置文件nginx.conf中加入:inc ...
- 【tp6】解决Driver [Think] not supported.
使用助手函数view时会出现 解决方法:使用composer安装composer require topthink/think-view
- Spring Cloud Hystrix 学习(三)请求合并
什么是请求合并?我们先来看两张图: 上方的两张图中,第二张可以看出服务端只执行了一次响应,这就是请求合并.客户端新增的请求合并模块,内部存在一个等待的时间窗口,将一定时间段内满足条件的请求进行合并,以 ...
- webpack工具学习 构建简单vue项目(不依赖vue-cli) webpack4.0
目的用webpack构建简单前端项目 1.npm init (npm init -y) 形成package.json 2.npm install --save-dev webpack 形成 n ...
- 利用Qt中的ui文件生成PyQt5程序,自定义槽函数
1.在Qt Creator4.8.0上面设计如上.ui文件 2.点击上方图标,可以建立信号-槽连接,button_click()为自定义槽函数 3.设计目的:点击clear按钮,可消除上方文本框中的内 ...