09.二叉搜索树的前驱节点和后继节点

二叉搜索树的前驱节点

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

Java子节点递归父节点拼接名字 从子节点往父节点查找_深度优先

  • 找前驱节点两种情况:
  1. 当前节点的左子树不为空。则一直遍历左子树的右节点,直至为null。
  2. 当前节点的左子树为空,则从父节点开始寻找前驱节点:
  1. 如果当前节点为父节点的右子树,则父节点即为前驱节点。例:7的前驱节点为6。
  2. 如果当前节点为父节点的左子树,则依次遍历父节点,直至遍历的节点为父节点的右子树为止。因为属于父节点的左子树都是比该节点大的,循环遍历到节点为父节点的右子树时,该节点的父子树才比该节点小。例如:9的前驱节点为8。
  3. 如果父节点为空,返回当前节点的父节点,即==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;
    }

二叉搜索树的后继节点

  • 后继节点:中序遍历时的后一个节点
  • 如果是二叉搜索树,后继节点就是一个比它大的节点
  • 找后继节点有两种情况:
  1. 当前节点的右子树不为空。则一直遍历右子树的左节点,直至为null。
  2. 当前节点的右子树为空,则从父节点开始寻找后继节点:
  1. 如果当前节点为父节点的左子树,则后继节点即为父节点。例:9的后继节点为10。
  2. 如果当前节点为父节点的右子树,则依次遍历父节点,直至遍历节点的父节点为左子树为止,因为如果遍历的父节点一直为右节点,肯定是比该节点小的,只有找到节点的父节点为左子树时,找到节点的父节点才比它大,即为后继节点。
  3. 如果父节点为空,返回当前节点的父节点,即==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;
    }