二叉搜索树和平衡二叉树

二叉搜索树
定义:对任意节点而言,其左子树(如果存在)所有的节点值均小于该节点的值,其右子树(如果存在)所有的节点值均大于该节点的值。

特点:中序遍历二叉搜索树得到的结果递增。

  1. 查找

  2. 插入
    需要明确的一点是:插入的新节点一定成为叶子节点。引入一个prev指针变量。

  3. 删除
    这里节点的删除分为三种情况:
    1) 该节点没有子树
    2)该节点只有一颗子树
    3)该节点有两颗子树,有两种解决办法:合并删除和复制删除。
    合并删除:查找到被删除节点P的左子树中按中序遍历的最后一个节点R,将R的右指针指向P的右子树的根,将P的左子树的根代替P。
    复制删除:找到P的左子树中值最大的节点或者P的右子树中值最小的节点R,如果R有子树,则将其唯一的子树放在R的位置。将R的值复制到P。

平衡二叉树(AVL树)
左右子树的高度差不会超过1。Adelson-Velskii和Landis发明了AVL树。AVL树是一种特殊的二叉搜索树。

  1. 查找
  2. 插入
    首先按照二叉搜索树的插入过程,然后再进行树的结构的调整,使其不破坏平衡性。
    具体来说,在插入一个新节点后,需要从插入位置到根的路径进行回溯,检查各节点的平衡因子(左右子树的高度差)。如果在某一节点处出现不平衡,则停止回溯。从发生不平衡的节点开始,沿着刚刚回溯的路径,取下两个节点。
    如果这三个节点处于一条直线,则采用单旋转进行平衡化;如果处于一条折线,则采用双旋转进行平衡化。
  3. 删除
    按照二叉搜索树的删除方法将节点删除。
    注意在平衡二叉树上删除一个节点,可能引起多次平衡化调整。如果平衡化调整后子树的高度不变则停止回溯。

猜你喜欢

转载自blog.csdn.net/YQMind/article/details/86133815