【剑指Offer学习】【面试题58:二叉树的下一个结点】
题目:给定一棵二叉树和当中的一个结点。怎样找出中序遍历顺序的下一个结点?树中的结点除了有两个分别指向左右子结点的指针以外,另一个指向父节点的指针。
解题思路
假设一个结点有右子树。那么它的下一个结点就是它的右子树中的左子结点。也就是说右子结点出发一直沿着指向左子结点的指针。我们就能找到它的下一个结点。
接着我们分析一个结点没有右子树的情形。
假设结点是它父节点的左子结点。那么它的下一个结点就是它的父结点。
假设一个结点既没有右子树。而且它还是它父结点的右子结点。这种情形就比較复杂。我们能够沿着指向父节点的指针一直向上遍历,直到找到一个是它父结点的左子结点的结点。假设这种结点存在。那么这个结点的父结点就是我们要找的下一个结点。
结点定义
private static class BinaryTreeNode {
private int val;
private BinaryTreeNode left;
private BinaryTreeNode right;
private BinaryTreeNode parent;
public BinaryTreeNode() {
}
public BinaryTreeNode(int val) {
this.val = val;
}
@Override
public String toString() {
return val + "";
}
}
代码实现
public class Test58 {
private static class BinaryTreeNode {
private int val;
private BinaryTreeNode left;
private BinaryTreeNode right;
private BinaryTreeNode parent;
public BinaryTreeNode() {
}
public BinaryTreeNode(int val) {
this.val = val;
}
@Override
public String toString() {
return val + "";
}
}
public static BinaryTreeNode getNext(BinaryTreeNode node) {
if (node == null) {
return null;
}
// 保存要查找的下一个节点
BinaryTreeNode target = null;
if (node.right != null) {
target = node.right;
while (target.left != null) {
target = target.left;
}
return target;
} else if (node.parent != null){
target = node.parent;
BinaryTreeNode cur = node;
// 假设父新结点不为空。而且。子结点不是父结点的左孩子
while (target != null && target.left != cur) {
cur = target;
target = target.parent;
}
return target;
}
return null;
}
private static void assemble(BinaryTreeNode node,
BinaryTreeNode left,
BinaryTreeNode right,
BinaryTreeNode parent) {
node.left = left;
node.right = right;
node.parent = parent;
}
public static void main(String[] args) {
test01();
}
// 1
// 2 3
// 4 5 6 7
// 8 9 10 11 12 13 14 15
public static void test01() {
BinaryTreeNode n1 = new BinaryTreeNode(1); // 12
BinaryTreeNode n2 = new BinaryTreeNode(2); // 10
BinaryTreeNode n3 = new BinaryTreeNode(3); // 14
BinaryTreeNode n4 = new BinaryTreeNode(4); // 9
BinaryTreeNode n5 = new BinaryTreeNode(5); // 11
BinaryTreeNode n6 = new BinaryTreeNode(6); // 13
BinaryTreeNode n7 = new BinaryTreeNode(7); // 15
BinaryTreeNode n8 = new BinaryTreeNode(8); // 4
BinaryTreeNode n9 = new BinaryTreeNode(9); // 2
BinaryTreeNode n10 = new BinaryTreeNode(10); // 5
BinaryTreeNode n11 = new BinaryTreeNode(11); // 1
BinaryTreeNode n12 = new BinaryTreeNode(12); // 6
BinaryTreeNode n13 = new BinaryTreeNode(13); // 3
BinaryTreeNode n14 = new BinaryTreeNode(14); // 7
BinaryTreeNode n15 = new BinaryTreeNode(15); // null
assemble(n1, n2, n3, null);
assemble(n2, n4, n5, n1);
assemble(n3, n6, n7, n1);
assemble(n4, n8, n9, n2);
assemble(n5, n10, n11, n2);
assemble(n6, n12, n13, n3);
assemble(n7, n14, n15, n3);
assemble(n8, null, null, n4);
assemble(n9, null, null, n4);
assemble(n10, null, null, n5);
assemble(n11, null, null, n5);
assemble(n12, null, null, n6);
assemble(n13, null, null, n6);
assemble(n14, null, null, n7);
assemble(n15, null, null, n7);
System.out.println(getNext(n1));
System.out.println(getNext(n2));
System.out.println(getNext(n3));
System.out.println(getNext(n4));
System.out.println(getNext(n5));
System.out.println(getNext(n6));
System.out.println(getNext(n7));
System.out.println(getNext(n8));
System.out.println(getNext(n9));
System.out.println(getNext(n10));
System.out.println(getNext(n11));
System.out.println(getNext(n12));
System.out.println(getNext(n13));
System.out.println(getNext(n14));
System.out.println(getNext(n15));
}
}
执行结果
【剑指Offer学习】【面试题58:二叉树的下一个结点】的更多相关文章
- 【剑指offer】面试题 8. 二叉树的下一个结点
面试题 8. 二叉树的下一个结点 NowCoder 题目描述 给定一棵二叉树和其中的一个结点,如何找出中序遍历顺序的下一个结点?树中的结点除了有两个分别指向左右子结点的指针以外,还有一个指向父结点的指 ...
- 剑指Offer(书):二叉树的下一个节点
题目:给定一个二叉树和其中的一个结点,请找出中序遍历顺序的下一个结点并且返回.注意,树中的结点不仅包含左右子结点,同时包含指向父结点的指针. 分析:若一个节点有右子树,那么他的下一个节点就是他右子树中 ...
- 剑指offer笔记面试题8----二叉树的下一个节点
题目:给定一棵二叉树和其中的一个节点,如何找出中序遍历序列的下一个节点?树中的节点除了有两个分别指向左.右子节点的指针,还有一个指向父节点的指针. 测试用例: 普通二叉树(完全二叉树,不完全二叉树). ...
- 《剑指offer》面试题39 二叉树的深度(java)
摘要: 今天翻到了<剑指offer>面试题39,题目二中的解法二是在函数的参数列表中通过指针的方式进行传值,而java是没有指针的,所以函数要进行改造.然而我翻了下别人的java版本(我就 ...
- (剑指Offer)面试题58:二叉树的下一个结点
题目: 给定一个二叉树和其中的一个结点,请找出中序遍历顺序的下一个结点并且返回.注意,树中的结点不仅包含左右子结点,同时包含指向父结点的指针. 思路: 考虑中序遍历的过程, 如果当前结点存在右子节点, ...
- 【剑指Offer】58:二叉树的下一个结点
题目描述 给定一个二叉树和其中的一个结点,请找出中序遍历顺序的下一个结点并且返回.注意,树中的结点不仅包含左右子结点,同时包含指向父结点的指针. 题解一:递归 //既然给了二叉树的某个结点,且二叉树存 ...
- 【剑指offer】面试题 55. 二叉树的深度
面试题 55. 二叉树的深度 题目一:二叉树的深度 题目描述:输入一棵二叉树,求该树的深度.从根结点到叶结点依次经过的结点(含根.叶结点)形成树的一条路径,最长路径的长度为树的深度. Java 实现 ...
- 《剑指Offer》面试题-重建二叉树
题目描述: 输入某二叉树的前序遍历和中序遍历的结果,请重建出该二叉树.假设输入的前序遍历和中序遍历的结果中都不含重复的数字.例如输入前序遍历序列{1,2,4,7,3,5,6,8}和中序遍历序列{4,7 ...
- 《剑指offer》面试题25 二叉树中和为某一值的路径 Java版
(判断是否有从根到叶子节点的路径,其和为给定值.记录这些路径.) 我的方法:这道题我是按照回溯的思路去做的,我们需要一个数据结构来保存和删除当前递归函数中添加的值.这里要打印一条路径,我们可以选择Li ...
- 《剑指offer》面试题19 二叉树的镜像 Java版
书中方法:这道题目可能拿到手没有思路,我们可以在纸上画出简单的二叉树来找到规律.最后我们发现,镜像的实质是对于二叉树的所有节点,交换其左右子节点.搞清楚获得镜像的方法,这道题实际上就变成了一道二叉树遍 ...
随机推荐
- 通过ansible一键部署集群ntp时间同步
环境准备 [root@server ~]# cat /etc/redhat-release CentOS Linux release (Core) [root@server ~]# uname -r ...
- 提升开发效率的一款mybatis开发神器
文末附有完整案例的代码内容!! 以前在开发的时候,使用mybatis的时候,经常都需要先配置xml映射文件,然后每条sql操作都需要自己进行手动编写,对于一些复杂的sql这么来操作确实有必要,但是如果 ...
- 站点部署,IIS配置优化指南
目录 一. 二. 三. 四. 五. 六. 七. 安全性 八. 多服务器IIS集中化管理web 通常把站点发布到IIS上运行正常后,很少会去考虑IIS提供的各种参数,如何配置才是 ...
- spring 自定义解析类
设计配置属性和JavaBean 编写XSD文件 编写NamespaceHandler和BeanDefinitionParser完成解析工作 编写spring.handlers和spring.schem ...
- WinSCP介绍、安装、使用(转)
http://blog.csdn.net/liang19890820/article/details/49700931 前言 如果说XManager通过Xshell.Xftp可以很方便的进行远程管理, ...
- 翻译BonoboService官网的安装教程
This page covers simple Bonobo Git Server installation. Be sure to check prerequisites page before i ...
- mysql二进制安装,升级,多实例部署
目标 理解线上部署考虑的因素 学会编译安装以及二进制安装mysql 学会升级mysql 学会多实例部署mysql数据库 学会合理部署mysql线上库 考虑因素: 版本选择,5.1,5.5还是5.6 ...
- 【好】Paxos以及分布式一致性的学习
Paxos,一言以蔽之,我们需要一种提交协议来确保分布式系统中的全局操作即使是在发生故障的情况下也能保证正确性. 跟拜占庭将军问题是不同的问题,虽然拜占庭也是Lamport提出的.拜占庭里面有叛徒,有 ...
- linuxshell编程之变量
变量分类: 用户自定义变量:局部变量 定义格式:变量名=变量值(*等号左右不能有空格,加了空格会报错) 调用格式:echo $变量名(调用的是变量名等效的值) 变量叠加:$x=123,y=" ...
- struts2类型转换+校验
1.action中validate()与validateXxx() 用于action执行前的校验,如果校验失败,跳到input视图, 前者校验整个Action: 后者校验该Action中的Xxx方法. ...