【Java】 剑指offer(7) 二叉树的下一个结点
本文参考自《剑指offer》一书,代码采用Java语言。
题目
给定一棵二叉树和其中的一个结点,如何找出中序遍历顺序的下一个结点? 树中的结点除了有两个分别指向左右子结点的指针以外,还有一个指向父结点的指针。
思路
首先自己在草稿纸上画图,进行分析(不再展开)。可以发现下一个结点的规律为:
1.若当前结点有右子树时,其下一个结点为右子树中最左子结点;
2.若当前结点无右子树时,
(1)若当前结点为其父结点的左子结点时,其下一个结点为其父结点;
(2)若当前结点为其父结点的右子结点时,继续向上遍历父结点的父结点,直到找到一个结点是其父结点的左子结点(与(1)中判断相同),该结点即为下一结点。
测试用例
1.正常二叉树
2.左斜树、右斜树
4.单个结点
5.null
6.不同位置结点的下一结点(即上面分析的几种情况、无下一节点等情况)
完整Java代码
(含测试代码)
由于树的生成较为繁琐,下面不含全部测试代码,但主体代码已经通过了牛客网中的测试,可以保证没有问题。
/**
*
* @Description 二叉树的下一个结点
*
* @author yongh
* @date 2018年9月12日 下午7:20:45
*/ // 题目:给定一棵二叉树和其中的一个结点,如何找出中序遍历顺序的下一个结点?
// 树中的结点除了有两个分别指向左右子结点的指针以外,还有一个指向父结点的指针。 public class NextNodeInBinaryTrees {
private class TreeLinkNode {
int val;
TreeLinkNode left = null;
TreeLinkNode right = null;
TreeLinkNode parent = null; TreeLinkNode(int val) {
this.val = val;
}
} public TreeLinkNode GetNext(TreeLinkNode pNode) {
if (pNode == null) {
System.out.print("结点为null ");
return null;
}
if (pNode.right != null) {
pNode = pNode.right;
while(pNode.left!=null)
pNode=pNode.left;
return pNode;
}
while(pNode.parent !=null){
if(pNode==pNode.parent .left)
return pNode.parent;
pNode=pNode.parent;
}
return null;
} // ==================================测试代码==================================
//创建树较为繁琐,未包括所有测试代码。
public void test1() {
TreeLinkNode node = null;
TreeLinkNode nextNode = GetNext(node);
if(nextNode!=null)
System.out.println(nextNode.val);
else
System.out.println("无下一结点");
} public void test2() {
TreeLinkNode node1 = new TreeLinkNode(1);
TreeLinkNode node2 = new TreeLinkNode(2);
TreeLinkNode node3 = new TreeLinkNode(3);
TreeLinkNode node4 = new TreeLinkNode(4);
node1.left = node2;
node1.right = node3;
node2.parent = node1;
node3.parent = node1;
node4.left=node1;
node1.parent=node4;
TreeLinkNode nextNodeOf1=GetNext(node1);
TreeLinkNode nextNodeOf2=GetNext(node2);
TreeLinkNode nextNodeOf3=GetNext(node3);
TreeLinkNode nextNodeOf4=GetNext(node4);
if(nextNodeOf1!=null)
System.out.println("1结点的下一个结点值为:"+nextNodeOf1.val);
else
System.out.println("1结点无下一结点");
if(nextNodeOf2!=null)
System.out.println("2结点的下一个结点值为:"+nextNodeOf2.val);
else
System.out.println("2结点无下一结点");
if(nextNodeOf3!=null)
System.out.println("3结点的下一个结点值为:"+nextNodeOf3.val);
else
System.out.println("3结点无下一结点");
if(nextNodeOf4!=null)
System.out.println("4结点的下一个结点值为:"+nextNodeOf4.val);
else
System.out.println("4结点无下一结点");
} public static void main(String[] args) {
NextNodeInBinaryTrees demo = new NextNodeInBinaryTrees();
System.out.print("test1:");
demo.test1();
System.out.print("test2:");
demo.test2();
}
}
test1:结点为null 无下一结点
test2:1结点的下一个结点值为:
2结点的下一个结点值为:
3结点的下一个结点值为:
4结点无下一结点
NextNodeInBinaryTrees
收获
1.在面对复杂问题时要学会画图和举例分析
2.在分情况讨论时,一定要考虑到所有情况,这些都是在写代码前需要考虑到的。
【Java】 剑指offer(7) 二叉树的下一个结点的更多相关文章
- 【剑指Offer】二叉树的下一个结点 解题报告(Python)
[剑指Offer]二叉树的下一个结点 解题报告(Python) 标签(空格分隔): 剑指Offer 题目地址:https://www.nowcoder.com/ta/coding-interviews ...
- 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 题目描述 给定一棵二叉树和其中的一个结点,如何找出中序遍历顺序的下一个结点?树中的结点除了有两个分别指向左右子结点的指针以外,还有一个指向父结点的指 ...
- 剑指offer:JZ8 二叉树的下一个结点
JZ8 二叉树的下一个结点 描述 给定一个二叉树其中的一个结点,请找出中序遍历顺序的下一个结点并且返回.注意,树中的结点不仅包含左右子结点,同时包含指向父结点的next指针.下图为一棵有9个节点的二叉 ...
随机推荐
- 目标提取深度神经网络分析权衡 trade offs
RCNN: 直接使用object proposal 方法得到image crops 送入神经网络中,但是crops 的大小不一样,因此使用 ROI Pooling,这个网络层可以把不同大小的输入映射到 ...
- Python - Scrapy 框架
Scrapy 是采用Python 开发的一个快速可扩展的抓取WEB 站点内容的爬虫框架.Scrapy,Python开发的一个快速,高层次的屏幕抓取和web抓取框架,用于抓取web站点并从页面中提取结构 ...
- Storm 集群
Apache Storm Storm是一个分布式的,可靠的,容错的数据流处理系统.Storm集群的输入流由一个被称作spout的组件管理,spout把数据传递给bolt,bolt要么把数据保存到某种存 ...
- JavaScript之柯里化
//未柯里化 function add(a,b){ return a + b; } //柯里化 function add(y){ return function(x){ console.log(y + ...
- Java的三种代理模式:静态代理/JDK动态代理/Cglib动态代理
1.静态代理:需要定义接口或者父类,目标对象与代理对象均实现同一接口或继承同一父类. 2.JDK动态代理:需要目标对象实现一个接口,通过动态反射的机制,生成代理对象,实现同一个接口 3.Cglib动态 ...
- mac系统在配置navicat时连接数据的时候提示can't connect to mysql server on '127.0.0.1'
新建数据库连接的时候,将默认的端口号更改掉,改为3307,即可解决这个问题. 具体是为什么我也不清楚,我自己想的一个可能就是mac电脑 上的某个程序可能已经占用了3306那个默认的端口,因 ...
- Three.js基础探寻二——正交投影照相机
本篇主要介绍照相机中的正交投影照相机. 第一篇传送门:Three.js基础探寻一 1.照相机 图形学中的照相机定义了三维空间到二维屏幕的投影方式. 针对投影方式照相机分为正交投影照相机和透视投影照相机 ...
- 单页应用 WebApp SPA 骨架 框架 路由 页面切换 转场
这里收录三个同类产品,找到他们花了我不少时间呢. 张鑫旭写的mobilebone自述:mobile移动端,PC桌面端页面无刷新过场JS骨架,简单.专注!http://www.zhangxinxu.co ...
- 【转】Python之装饰器
[转]Python之装饰器 本节内容 必要知识回顾 情景模拟 装饰器的概念及实现原理 回马枪(带参数的装饰器) 一. 必要知识回顾 在开始说装饰器之前,需要大家熟悉之前说过的相关知识点: 函数即“变量 ...
- shiro设置session超时时间
系统默认超时时间是180000毫秒(30分钟) long timeout = SecurityUtils.getSubject().getSession().getTimeout(); System. ...