后继节点查找分成两种情况:
1.一个节点有右子树,那么它的下一个节点就是它的右子树中的最左子节点。例如b的后继节点是h。
2.一个节点没有右子树时分两种情况:
(1)当前节点是它父节点的左子节点,那么它的下一个节点就是它的父节点。
(2)当前节点是它父节点的右子节点,此时沿着指向父节点的指针一直向上遍历,直到找到一个是它父节点的左子节点的节点,如果这个节点
存在,那么这个节点的父节点就是我们要找的下一个节点。
//二叉树的节点类
public class Node {
public int data;
public Node leftChild;
public Node rightChildNode;
public Node parentNode;
public Node(int value)
{
this.data = value;
}
}
//构造二叉树
public void insert (int value){
Node curNode = root;
Node parentNode = root;
Node node = new Node(value);
if(root == null){
root = node;
return;
}
while(true){
parentNode = curNode;
if(root.data >value){
curNode = curNode.leftChild;
if(curNode == null){
parentNode.leftChild = node;
node.parentNode = parentNode;
return;
}
}
else{
curNode = curNode.rightChildNode;
if(curNode == null){
parentNode.rightChildNode = node;
node.parentNode = parentNode;
return;
}
}
}
}
//查找后继节点
public Node findAterNode(int value){
Node curNode = root;
Node parentNode = null;
Node afterNode = null;
Node afterParent = null;
//找到该节点
boolean isLeftchild = false;
while(curNode.data != value){
parentNode = curNode;
if(curNode.data > value){
curNode = curNode.leftChild;
isLeftchild = true;
}
else{
curNode = curNode.rightChildNode;
isLeftchild =false;
}
}
//第一种情况,该节点有右子节点
if(curNode.rightChildNode != null){
curNode = curNode.rightChildNode;
while(curNode.leftChild != null){
afterParent = afterNode;
afterNode = curNode;
curNode = curNode.leftChild;
}
}
//第二种情况,该节点为其父节点的左子节点
else if(isLeftchild){
afterNode = parentNode;
}
//第三种情况,该节点为其父节点的右子节点;该情况需要在每个节点存储其父节点
else{
Node parent = curNode.parentNode;
while(parent != null && parent.leftChild != curNode){
curNode = parent;
parent = curNode.parentNode;
}
afterNode = parent;
}
return afterNode;
}