前驅結點:節點val值小於該節點val值並且值最大的節點
后繼節點:節點val值大於該節點val值並且值最小的節點
二叉樹的節點val值是按照二叉樹中序遍歷順序連續設定。
前驅結點
- 如圖4的前驅結點是3
- 2的前驅結點是1
- 6的前驅結點是5
后繼節點
- 7的后繼結點是8
- 5的后繼節點是6
- 2的后繼節點是3
前驅節點
- 若一個節點有左子樹,那么該節點的前驅節點是其左子樹中val值最大的節點(也就是左子樹中所謂的rightMostNode)
- 若一個節點沒有左子樹,那么判斷該節點和其父節點的關系
2.1 若該節點是其父節點的右邊孩子,那么該節點的前驅結點即為其父節點。
2.2 若該節點是其父節點的左邊孩子,那么需要沿着其父親節點一直向樹的頂端尋找,直到找到一個節點P,P節點是其父節點Q的右邊孩子(可參考例子2的前驅結點是1),那么Q就是該節點的后繼節點
后繼節點
- 若一個節點有右子樹,那么該節點的后繼節點是其右子樹中val值最小的節點(也就是右子樹中所謂的leftMostNode)
- 若一個節點沒有右子樹,那么判斷該節點和其父節點的關系
2.1 若該節點是其父節點的左邊孩子,那么該節點的后繼結點即為其父節點
2.2 若該節點是其父節點的右邊孩子,那么需要沿着其父親節點一直向樹的頂端尋找,直到找到一個節點P,P節點是其父節點Q的左邊孩子(可參考例子2的前驅結點是1),那么Q就是該節點的后繼節點
實現
/**
* 前驅元素
* **/
public BSTreeNode<T> Pred(BSTreeNode<T> node) {
if (node.left != null) {
return Max(node.left);
}
BSTreeNode<T> parent = node.parent;
while (parent != null && node != parent.right) {
node = parent;
parent = node.parent;
}
return parent;
}
/**
* 后繼元素
* **/
public BSTreeNode<T> Succ(BSTreeNode<T> node) {
if (node.right != null) {
return Min(node.right);
}
BSTreeNode<T> parent = node.parent;
while (parent != null && node != parent.left) {
node = parent;
parent = node.parent;
}
return parent;
}