剑指offer52--找到二叉树下一个结点
2016-07-28 13:35
459 查看
一、题目
题目:给定一棵二叉树和其中的一个结点,如何找出中序遍历顺序的下一个结点?树中的结点除了有两个分别指向左右子结点的指针以外,还有一个指向父节点的指针。
二、举例
如上图所示其中序的遍历结果是:10-4-2-5-1-6-7-9-8-3
(1)2 的下一个元素是:5
(2)4 的下一个元素是:2
(3)8 的下一个元素是:3
三、思想
(1)当结点有右子树的这种情况,也就是如图中结点“2”的下一个结点是“5”(2)当结点没有右子树,但是是父结点的右子结点,这种情况下其下一个结点就是父结点,如“4”的下一个结点是“2”
(3)当结点没有右子树同时是父结点的左结点情况时,然后就一直往上推,直到某个结点如图中的“6”是父结点“3”的左结点,
其下一个结点就是这个父结点,如“8”的下一个结点是“3”
四、程序
package 剑指offer; public class Test58 { public static BinaryTreeNodeNext findNextNode(BinaryTreeNodeNext node){ if(node == null){ return null; } BinaryTreeNodeNext target = null; //[1]如果其右子树不为空,那么查找其右子树的做孩子 if(node.right != null){ target = node.right; while(target.left != null){ target = target.left; } return target; } //[2]如果没有右子树,找到其父节点,分情况讨论 else if(node.parent != null){ target = node.parent; BinaryTreeNodeNext current = node; // 结点既没有右子树,也还是父结点的右结点的时候,一直向上找,直到找到一个结点是父结点的左子树 while(target != null && target.left != current){ current = target; target = target.parent; } return target; } return null; } private static void assemble(BinaryTreeNodeNext node, BinaryTreeNodeNext left, BinaryTreeNodeNext right, BinaryTreeNodeNext parent) { node.left = left; node.right = right; node.parent = parent; } public static void main(String args[]){ // 1 // 2 3 // 4 5 6 7 BinaryTreeNodeNext n1 = new BinaryTreeNodeNext(1); BinaryTreeNodeNext n2 = new BinaryTreeNodeNext(2); BinaryTreeNodeNext n3 = new BinaryTreeNodeNext(3); BinaryTreeNodeNext n4 = new BinaryTreeNodeNext(4); BinaryTreeNodeNext n5 = new BinaryTreeNodeNext(5); BinaryTreeNodeNext n6 = new BinaryTreeNodeNext(6); BinaryTreeNodeNext n7 = new BinaryTreeNodeNext(7); assemble(n1, n2, n3, null); assemble(n2, n4, n5, n1); assemble(n3, n6, n7, n1); assemble(n4, null, null, n2); assemble(n5, null, null, n2); assemble(n6, null, null, n3); assemble(n7, null, null, n3); System.out.println("n1 next :"+findNextNode(n1)); System.out.println("n2 next :"+findNextNode(n2)); System.out.println("n3 next :"+findNextNode(n3)); System.out.println("n4 next :"+findNextNode(n4)); System.out.println("n5 next :"+findNextNode(n5)); System.out.println("n6 next :"+findNextNode(n6)); System.out.println("n7 next :"+findNextNode(n7)); } } class BinaryTreeNodeNext{ int value; BinaryTreeNodeNext left; BinaryTreeNodeNext right; BinaryTreeNodeNext parent; public BinaryTreeNodeNext() { // TODO Auto-generated constructor stub } public BinaryTreeNodeNext(int value){ this.value = value; } public String toString(){ return value+""; } }-----------------output--------------------
n1 next :6 n2 next :5 n3 next :7 n4 next :2 n5 next :1 n6 next :3 n7 next :null
相关文章推荐
- java对世界各个时区(TimeZone)的通用转换处理方法(转载)
- java-注解annotation
- java-模拟tomcat服务器
- java-用HttpURLConnection发送Http请求.
- java-WEB中的监听器Lisener
- Android IPC进程间通讯机制
- Android Native 绘图方法
- Android java 与 javascript互访(相互调用)的方法例子
- 介绍一款信息管理系统的开源框架---jeecg
- 聚类算法之kmeans算法java版本
- java实现 PageRank算法
- PropertyChangeListener简单理解
- c++11 + SDL2 + ffmpeg +OpenAL + java = Android播放器
- 插入排序
- 冒泡排序
- 堆排序
- 快速排序