给你二叉树中的某个结点,返回该结点的后继结点
后继结点:即中序遍历下的下一个结点
明确一点,中序遍历,左中右,首先,中肯定是存在的,就是本阶段,就要拿右子树做文章。
分为两种情况:
一、右子树存在,则根据左中右,找到右子树中的最左结点,如果最左为null,则其父节点就是 中序遍历下的下一个结点。
二、右子树不存在,则根据左 中 右,需要去找父结点,且当前树不能是右子树,不然就不是下一个,而是上一个。
/**
* 得到当前结点的后继结点
* 后继结点:中序遍历下本节点的下一个结点
* 左中右
*
* @param node
* @return
*/
public static Node getSuccessorNode(Node node) {
if (node == null) {
return null;
}
if (node.right != null) {
node = node.right;
while (node.left != null) {
node = node.left;
}
return node;
} else {
//如果右子树为空,则下一个结点在父结点,其当前子树不得为右子树
Node parent = node.parent;
while (parent != null && parent.right == node) {
node = parent;
parent = parent.parent;
}
return parent;
}
}