给定一个二叉树和其中的一个结点,请找出中序遍历顺序的下一个结点并且返回。注意,树中的结点不仅包含左右子结点,同时包含指向父结点的指针。
一个节点中序遍历的下一个节点,一定是在父亲节点之上,或者在右子树上。
public TreeLinkNode getNext(TreeLinkNode node) {
if (node == null) return null;
TreeLinkNode target = null;
if (node.right != null) {
target = target.right;
while (target.left != null) {
target = target.left;
}
return target;
} else if (node.parent != null) {
target = node.parent;
TreeLinkNode curr = null;
// 如果父新节点不为空,且,子节点是父节点的左孩子
while (target != null && target.left != curr) {
curr = target;
target = target.parent;
}
return target;
}
return null;
}
public TreeLinkNode GetNext(TreeLinkNode node) {
if (node == null) return null;
if (node.right != null) {
TreeLinkNode curr = node.right;
while (curr.left != null) {
curr = curr.left;
}
return curr;
}
if (node.next != null) {
TreeLinkNode curr = node, parent = curr.next;
// 最后一个节点的下一个为null
while (parent != null && parent.left != curr) {
curr = parent;
parent = parent.next;
}
return parent;
}
return null;
}