/**
* 剑指offer书中:二叉树的下一个节点
* 1.若当前结点有右子树时,其下一个结点为右子树中最左子结点;
* 2.若当前结点无右子树时,
* (1)若当前结点为其父结点的左子结点时,其下一个结点为其父结点;
* (2)若当前结点为其父结点的右子结点时,继续向上遍历父结点的父结点,
* 直到找到一个结点是其父结点的左子结点(与(1)中判断相同),该结点即为下一结点。
* @Description
*/
public class Test06 {
//树的节点比较特殊,除了指向左右子树的节点外,还包含一个指向父节点的指针
class TreeLinkNode{
int value;
TreeLinkNode left;
TreeLinkNode right;
TreeLinkNode parent;
public TreeLinkNode(int value){
this.value = value;
}
}
public TreeLinkNode getNext(TreeLinkNode root){
if (root == null) return null;
//分析的第一种情况
if (root.right != null){
root = root.right;
while (root.left != null){
root = root.left;
}
return root;
}
//分析的第二种情况
while (root.parent != null){
if (root == root.parent.left){
return root.parent;
}
root = root.parent;
}
return null;
}
}