详情参看《程序员代码面试指南》P153
package com.gxu.dawnlab_algorithm4;
/**
* 在二叉树中找到一个节点的后继节点
* @author junbin
*
* 2019年6月28日
*/
public class SuccessorNode {
public static class Node{
public int data;
public Node left;
public Node right;
public Node parent;
public Node(int data){
this.data = data;
}
}
public static Node getSuccessorNode(Node node){
if(node == null){
return node;
}
if(node.right != null){
return getLeftMost(node.right);
}else{
Node parent = node.parent;
while(node != null && node != node.parent.left){
node = parent;
parent = node.parent;
}
return parent;
}
}
public static Node getLeftMost(Node node){
if(node == null){
return node;
}
while(node.left != null){
node = node.left;
}
return node;
}
public static void main(String[] args) {
Node head = new Node(6);
head.parent = null;
head.left = new Node(3);
head.left.parent = head;
head.left.left = new Node(1);
head.left.left.parent = head.left;
head.left.left.right = new Node(2);
head.left.left.right.parent = head.left.left;
head.left.right = new Node(4);
head.left.right.parent = head.left;
head.left.right.right = new Node(5);
head.left.right.right.parent = head.left.right;
head.right = new Node(9);
head.right.parent = head;
head.right.left = new Node(8);
head.right.left.parent = head.right;
head.right.left.left = new Node(7);
head.right.left.left.parent = head.right.left;
head.right.right = new Node(10);
head.right.right.parent = head.right;
Node test = head.left.left;
System.out.println(test.data + " next: " + getSuccessorNode(test).data);
test = head.left.left.right;
System.out.println(test.data + " next: " + getSuccessorNode(test).data);
test = head.left;
System.out.println(test.data + " next: " + getSuccessorNode(test).data);
test = head.left.right;
System.out.println(test.data + " next: " + getSuccessorNode(test).data);
test = head.left.right.right;
System.out.println(test.data + " next: " + getSuccessorNode(test).data);
test = head;
System.out.println(test.data + " next: " + getSuccessorNode(test).data);
test = head.right.left.left;
System.out.println(test.data + " next: " + getSuccessorNode(test).data);
test = head.right.left;
System.out.println(test.data + " next: " + getSuccessorNode(test).data);
test = head.right;
System.out.println(test.data + " next: " + getSuccessorNode(test).data);
test = head.right.right; // 10's next is null
System.out.println(test.data + " next: " + getSuccessorNode(test));
}
}