public class BinaryTreeGetNext {
public static void main(String args[]) {
getNext(new BinaryTreeNode(3));
}
private static BinaryTreeNode getNext(BinaryTreeNode treeNode) {
if (treeNode == null) {
return null;
}
BinaryTreeNode mNext = null;
// 有右子树
if (treeNode.right != null) {
BinaryTreeNode mRight = treeNode.right;
while (mRight.left != null) {
mRight = mRight.left;
}
mNext = mRight;
}
// 没有右子树
else if (treeNode.parent != null) {
BinaryTreeNode mCurNode = treeNode;
BinaryTreeNode mParNode = mCurNode.parent;
while (mParNode != null && mCurNode == mParNode.right) {
mCurNode = mParNode;
mParNode = mParNode.parent;
}
mNext = mParNode;
}
return mNext;
}
private static class BinaryTreeNode {
int val;
BinaryTreeNode left;
BinaryTreeNode right;
BinaryTreeNode parent;
BinaryTreeNode(int val) {
this.val = val;
}
}
}
要点提示:
- 1、在当前节点有右子树的情况下,循环遍历右子树的左子节点及其子节点的左子节点
- 2、没有右子树的情况,判断循环结束的关键在于在当前节点父节点非空且当前节点是否等于其父节点的右子节点
- 3、当前节点等于其父节点的右子节点 表明要继续向上遍历父节点,否则遍历结束