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、當前節點等於其父節點的右子節點 表明要繼續向上遍歷父節點,否則遍歷結束