后继节点一共有两种情况:
一种情况是当前节点有右子树,那么当前节点的后继节点一定在它的右子树上,即为右子树的最左边;
另一种情况是当前节点(node)没有右子树,先看当前节点的父节点(parent)的左孩子是否是当前节点,若是则父节点是后继节点,若不是就向上寻找,另node=parent,parent=node.parent直到node是parent的左孩子。
public class GetNextNode {
@Test
public void test(){
NodeP node5=new NodeP(1);
NodeP node1=new NodeP(2);
NodeP node2=new NodeP(3);
NodeP node3=new NodeP(4);
NodeP node4=new NodeP(5);
NodeP head=new NodeP(6);
NodeP node6=new NodeP(7);
NodeP node7=new NodeP(8);
NodeP node8=new NodeP(9);
NodeP node9=new NodeP(10);
head.left=node2;
head.right=node8;
node2.parent=head;
node8.parent=head;
node2.left=node5;
node2.right=node3;
node5.parent=node2;
node3.parent=node2;
node5.right=node1;
node1.parent=node5;
node3.right=node4;
node4.parent=node3;
node8.left=node7;
node8.right=node9;
node7.parent=node8;
node9.parent=node8;
node7.left=node6;
node6.parent=node7;
NodeP node=getNextNode(node4);
if(node!=null){
System.out.println(node.data);
}else {
System.out.println("null");
}
}
public NodeP getNextNode(NodeP node){
if(node==null){
return null;
}
if(node.right!=null){
NodeP temp=node.right;
while (temp.left!=null){
temp=temp.left;
}
return temp;
}else {
NodeP temp=node.parent;
while (temp!=null &&temp.left!=node){
node=temp;
temp=temp.parent;
}
return temp;
}
}
}
class NodeP{
int data;
NodeP left;
NodeP right;
NodeP parent;
public NodeP(int data){
this.data=data;
}
}