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;
}