二叉排序树

124 阅读2分钟

本文已参与「新人创作礼」活动,一起开启掘金创作之路。

二叉排序树

对数列 (7, 3, 10, 12, 5, 1, 9)操作,高效的完成对数据的查询和添加

分析:

使用数组

  1. 数组未排序

    • 优点:直接在数组尾添加,速度快
    • 缺点:查找速度慢
  2. 数组排序

    • 优点:可以使用二分查找,查找速度快
    • 缺点:为了保证数组有序, 在添加新数据时,找到插入位置后,后面的数据需整体移动,速度慢

使用链表

  • 不管链表是否有序,查找速度都慢,添加数据速度比数组快,不需要数据整体 移动

使用二叉排序树

基本介绍

  • 二叉排序树:BST: (Binary Sort(Search) Tree), 对于二叉排序树的任何一个非叶子节点,要求==左子节点的值比当前节点的值小,右子节点的值比当前节点的值大==。

  • 如果有相同的值,可以将该节点放在左子节点或右子节点

  • 对数据(7, 3, 10, 12, 5, 1, 9)进行二叉排序树

    image-20220914222821047

二叉排序树创建与遍历

数组创建成一个二叉排序树,使用中序遍历二叉排序树。Array(7, 3, 10, 12, 5, 1, 9) 对此数组进行中序遍历二叉排序树

二叉排序树的删除(解析篇)

分析

  1. 删除叶子节点 (比如:2, 5, 9, 12)

    • 即该节点下==没有==左右子节点

    1. 找到要删除的结点,targetNode

    2. 找到 targetNode 的父节点 parent

    3. 确定 targetNode 是parent 的左子结点,还是右子结点

    4. 更情况来对应删除

      • 左子结点:parent . left = null
      • 右子结点:parent . right = null
  2. 删除只有一颗子树的节点 (比如:1)

    • 即该节点有左子节点==或==者右子节点

    1. 找到要删除的结点,targetNode

    2. 找到 targetNode 的父节点 parent

    3. 确定 targetNode 的子节点是左子结点还是右子结点

    4. targetNode 是 parent 的左子结点还是右子结点

    5. 若targetNode 有左子结点

      • targetNode 是 parent 的左子结点
      • parent.left = targetNode.left
      • targetNode 是 parent 的右子结点
      • parent.right= targetNode.left
    6. 若targetNode 有右子结点

      • targetNode 是 parent 的左子结点
      • parent.left = targetNode.right
      • targetNode 是 parent 的右子结点
      • parent.right= targetNode.right
  3. 删除有两颗子树的节点. (比如:删除10 )

    • 即该节点有左子节点==和==者右子节点

    1. 找到要删除的结点,targetNode
    2. 找到 targetNode 的父节点 parent
    3. 从 targetNode 的右子树找到最小的结点,保存在一个变量中 temp
    4. 删除最小结点
    5. targetNode.value = temp

image-20220914223559216