本文参考自《剑指offer》一书,代码采用Java语言。

 更多:《剑指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.在分情况讨论时,一定要考虑到所有情况,这些都是在写代码前需要考虑到的。

更多:《剑指Offer》Java实现合集

【Java】 剑指offer(7) 二叉树的下一个结点的更多相关文章

  1. 【剑指Offer】二叉树的下一个结点 解题报告(Python)

    [剑指Offer]二叉树的下一个结点 解题报告(Python) 标签(空格分隔): 剑指Offer 题目地址:https://www.nowcoder.com/ta/coding-interviews ...

  2. Go语言实现:【剑指offer】二叉树的下一个结点

    该题目来源于牛客网<剑指offer>专题. 给定一个二叉树和其中的一个结点,请找出中序遍历顺序的下一个结点并且返回. 注意,树中的结点不仅包含左右子结点,同时包含指向父结点的指针. Go语 ...

  3. 剑指Offer 57. 二叉树的下一个结点 (二叉树)

    题目描述 给定一个二叉树和其中的一个结点,请找出中序遍历顺序的下一个结点并且返回.注意,树中的结点不仅包含左右子结点,同时包含指向父结点的指针. 题目地址 https://www.nowcoder.c ...

  4. [剑指Offer] 57.二叉树的下一个结点

    题目描述 给定一个二叉树和其中的一个结点,请找出中序遍历顺序的下一个结点并且返回.注意,树中的结点不仅包含左右子结点,同时包含指向父结点的指针. /* struct TreeLinkNode { in ...

  5. 剑指offer——06二叉树的下一个节点

    题目描述 给定一个二叉树和其中的一个结点,请找出中序遍历顺序的下一个结点并且返回.注意,树中的结点不仅包含左右子结点,同时包含指向父结点的指针.   题目的意思是,在一颗二叉树的中序遍历中,给出其中一 ...

  6. 剑指offer57:二叉树的下一个结点

    1 题目描述 给定一个二叉树和其中的一个结点,请找出中序遍历顺序的下一个结点并且返回.注意,树中的结点不仅包含左右子结点,同时包含指向父结点的指针. 2 思路和方法 中序遍历,下一个结点有两种情况 a ...

  7. [剑指Offer]8-二叉树的下一个节点

    链接 https://www.nowcoder.com/practice/9023a0c988684a53960365b889ceaf5e?tpId=13&tqId=11210&tPa ...

  8. 【剑指offer】面试题 8. 二叉树的下一个结点

    面试题 8. 二叉树的下一个结点 NowCoder 题目描述 给定一棵二叉树和其中的一个结点,如何找出中序遍历顺序的下一个结点?树中的结点除了有两个分别指向左右子结点的指针以外,还有一个指向父结点的指 ...

  9. 剑指offer:JZ8 二叉树的下一个结点

    JZ8 二叉树的下一个结点 描述 给定一个二叉树其中的一个结点,请找出中序遍历顺序的下一个结点并且返回.注意,树中的结点不仅包含左右子结点,同时包含指向父结点的next指针.下图为一棵有9个节点的二叉 ...

随机推荐

  1. 20155301 2016-2017-2 《Java程序设计》第7周学习总结

    20155301 2016-2017-2 <Java程序设计>第7周学习总结 教材学习内容总结 1.例如 Compartor<String>byLength=new Compa ...

  2. 第14月第30天 svn 撤销ignore revert

    1. 直接到被ignore的位置,执行: svn add <你被ignore的文件名> --no-ignore –no-ignore是取消忽略 如果是add目录,你可以: svn add ...

  3. 给父元素与子元素分别设置visibility注意点

    由于机顶盒的终端特性原因,不能用display:hidden去做隐藏,就选择了visibility:hidden. 在这里遇到一个现象: 给父元素设置了hidden,但是里面的子元素依然可见.以为只是 ...

  4. extern的作用

    #include <stdio.h>extern int a;static int a;extern int b;int b;static int c;extern int c;

  5. python线程之condition

    cond = threading.Condition() # 类似lock.acquire() cond.acquire() # 类似lock.release() cond.release() # 等 ...

  6. windws 下 sublime Text 3 ·安装的安装与激活

    下载sublime 我们可以到官网进行下载对应的版本 https://www.sublimetext.com/3 如下是官网的内容(我选择的是Windows 64 bit). Sublime Text ...

  7. SpringBoot2.x配置文件讲解

    SpringBoot2.x配置文件讲解 简介:SpringBoot2.x常见的配置文件 xml.yml.properties的区别和使用 xml.properties.json.yaml 1.常见的配 ...

  8. canny 算子python实现

    1. Canny介绍 Canny算子与Marr(LoG)边缘检测方法类似,也属于是先平滑后求导数的方法.John Canny研究了最优边缘检测方法所需的特性,给出了评价边缘检测性能优劣的三个指标: 1 ...

  9. register 用法注意与深入--【sky原创】

    register 用法注意与深入:   gcc -o test  test.c   这样编译的话会报错的,因为寄存器变量是不能取地址的,只有内存的变量才能取地址 寄存器变量取的是虚拟地址   #inc ...

  10. 转载:小结(1.7)《深入理解Nginx》(陶辉)

    原文:https://book.2cto.com/201304/19622.html 本章介绍了Nginx的特点以及在什么场景下需要使用Nginx,同时介绍了如何获取Nginx以及如何配置.编译.安装 ...