二叉搜索树(算法导论版)

二叉搜索树结构

  • 链表数据结构存储
  • 包含key,卫星数据,左右子节点,父节点
  • 左子树的最大值小于根节点的值小于右子树的最小值

二叉树的遍历

遍历时间为o(n),n为树节点总数
这种遍历的实现是迭代的方法,故每次遍历以当前节点为父节点.

  • 先序遍历:中,左,右
  • 中序遍历:左,中,右
  • 后序遍历:左,右,中

二叉树的查找

查找时间为o(h),h为树的高度

  • 查找步骤:
    • 从跟节点开始,比较x.key与k;(x.key为节点的值,k为输入的检索值)
    • 如果k
    • 如果k>key,则搜索该节点的右子树
  • 基于二叉树的搜索性质,可找到其最大值和最小值对应的节点,也可找到树中某一节点的后继和前驱.
  • 后继和前驱均都为中序遍历的顺序,寻找方法:
    • 后继:
      • 为当前节点右子树中具有最小值的节点(可通过调用查找最小值的函数直接搜索);若当前节点为树中最大节点,则返回为空.
      • 如果当前节点没有右子树,则其后继节点为其所在左子树的第一个根节点.
    • 前驱:查找左子树的最小值即可

二叉树的插入与删除

  • 插入:时间复杂度为o(h)
    1. 从根节点开始,比较当前节点与插入节点的值
    2. 如果根节点不存在,则将新节点插入根节点
    3. 如果新节点的值小于当前节点,则以左子节点作为当前节点,如果新节点的值大于当前节点,则以右子节点作为当前节点.
  • 删除:
    1. 如果当前节点没有左子节点,则以其右子节点替换(右子节点可为nil)
    2. 如果当前节点仅有一个左子节点,则用左子节点替换
    3. 如果当前节点有左右两子节点:
      1. 如果右子树的最小值节点无子节点,则直接替换当前节点
      2. 如果右子树最小值节点有右子节点,则先以右子节点替换最小值节点,再以最小值节点替换当前节点.

二叉树子树的替换

将一个子树连到另一个子树的父节点上
  • 用节点v的子树替换节点u的子树:
    1. 将u的父节点的对应子节点指针连接到v
    2. 将v的父节点指针连接到u的父节点

在进行二叉树的删除时,仅进行节点的替换,故而要将原节点对应的子树重新连接

你可能感兴趣的:(二叉搜索树(算法导论版))