09.二叉搜索树的前驱节点和后继节点
二叉搜索树的前驱节点
- 先了解一下前驱节点
- 前驱节点:中序遍历时的前一个节点
- 但如果是二叉搜索树,前驱节点就是前一个比它小的节点

- 找前驱节点两种情况:
- 当前节点的左子树不为空。则一直遍历左子树的右节点,直至为null。
- 当前节点的左子树为空,则从父节点开始寻找前驱节点:
- 如果当前节点为父节点的右子树,则父节点即为前驱节点。例:7的前驱节点为6。
- 如果当前节点为父节点的左子树,则依次遍历父节点,直至遍历的节点为父节点的右子树为止。因为属于父节点的左子树都是比该节点大的,循环遍历到节点为父节点的右子树时,该节点的父子树才比该节点小。例如:9的前驱节点为8。
- 如果父节点为空,返回当前节点的父节点,即==null。
上代码:
public Node<E> predecessor(Node<E> node){
if ( node == null ) return null;
Node<E> p =node.left;
if ( p != null ){
//1.当前节点的左子树不为空
while(p.right != null){
p = p.right;
}
return p;
}
//2.当前节点的左子树为空
// 从父节点、祖父节点中寻找前驱节点
while(node.parent != null && node == node.parent.left){
node = node.parent;
}
//3.循环到这有两种情况
//3.1 node.parent == null;-->即前驱节点为null(也可以是node.parent)
//3.2 node = node.parent.right;-->即前驱节点为node.parent
return node.parent;
}二叉搜索树的后继节点
- 后继节点:中序遍历时的后一个节点
- 如果是二叉搜索树,后继节点就是一个比它大的节点
- 找后继节点有两种情况:
- 当前节点的右子树不为空。则一直遍历右子树的左节点,直至为null。
- 当前节点的右子树为空,则从父节点开始寻找后继节点:
- 如果当前节点为父节点的左子树,则后继节点即为父节点。例:9的后继节点为10。
- 如果当前节点为父节点的右子树,则依次遍历父节点,直至遍历节点的父节点为左子树为止,因为如果遍历的父节点一直为右节点,肯定是比该节点小的,只有找到节点的父节点为左子树时,找到节点的父节点才比它大,即为后继节点。
- 如果父节点为空,返回当前节点的父节点,即==null。
- 上代码:
public Node<E> successor(Node<E> node){
if (node == null ) return null;
Node<E> p = node.right;
if (p != null ){
// 1.前驱节点在左子树当中(right.left.left.left....)
while( p.left != null){
p = p.left;
}
return p;
}
//2.从父节点,祖父节点寻找前驱节点
while(node.parent != null && node == node.parent.right){
node = node.parent;
}
return node.parent;
}
















