欢迎光临
我们一直在努力

有序二叉树

二叉排序树(有序二叉树 / BST)… 1

一、基本概念… 1

二、节点结构(Java 通用定义)… 3

三、二叉排序树五大核心操作… 3

1. 插入节点(构建 BST 最基础操作)… 3

2. 查找节点… 5

3.广度优先遍历… 6

4.深度优先遍历… 8

—先序遍历… 8

–中序遍历… 10

—后序遍历… 11

5. 删除节点(最难重点,分 3 种情况)… 12

情况 1:待删节点是叶子节点(无左、无右孩子)… 12

情况 2:待删节点只有单侧子树(只有左孩子 / 只有右孩子)… 14

情况 3:待删节点左右子树都存在(最难)… 16

6. 获取最小值 / 最大值… 18

四、优缺点… 19

二叉排序树(有序二叉树 / BST)

一、基本概念

二叉排序树全称:二叉搜索树 Binary Search Tree,简称 BST

满足三大规则(核心判定条件)

  • 若左子树不为空:左子树上所有节点的值 < 根节点值
  • 若右子树不为空:右子树上所有节点的值 > 根节点值
  • 左右子树各自也必须是二叉排序树(递归满足规则)
  • ✅ 重要特性:

    对二叉排序树进行中序遍历(左→根→右),遍历结果一定是升序有序数组,这也是它叫有序二叉树的原因。

    示例:

            50

        30      70

      20  40  60  80

    中序遍历:20,30,40,50,60,70,80(从小到大排列)


    二、节点结构(Java 通用定义)

    二叉树每个节点包含:数据域、左孩子指针、右孩子指针


    三、二叉排序树五大核心操作

    1. 插入节点(构建 BST 最基础操作)

    插入规则:

  • 树为空:新节点直接作为根节点
  • 待插入值 < 当前节点值:去左子树递归插入
  • 待插入值 > 当前节点值:去右子树递归插入
  • 相等值:一般规定 BST 不允许存放重复元素,直接舍弃
  • 运行

    2. 查找节点

    查找逻辑:

  • 根为空 → 查找失败
  • 目标值 = 当前节点值 → 找到,返回当前节点
  • 目标值 < 当前节点 → 往左找
  • 目标值 > 当前节点 → 往右找
  • 3.广度优先遍历

    规则:从上至下,逐层遍历,每层从左到右

    核心逻辑

    借助队列:先进先出,根节点入队,出队时,它的左右节点入队

    1. 根节点入队

    2. 循环:队列不为空

       – 队首节点出队,访问数值

       – 左孩子不为空 → 入队

       – 右孩子不为空 → 入队

    4.深度优先遍历

    —先序遍历

    先序遍历:根 → 左 → 右

    –中序遍历

    中序遍历:左 → 根 → 右

    遍历结果永久升序排列

    —后序遍历

    后序遍历:左 → 右 → 根

    5. 删除节点(最难重点,分 3 种情况)

    情况 1:待删节点是叶子节点(无左、无右孩子)

    1.找到目标节点 target

    2.找到目标节点的父节点parent 没有父节点:root=null;有父节点:直接将父节点指向该节点的引用置为 null 即可。

    情况 2:待删节点只有单侧子树(只有左孩子 / 只有右孩子)

    1.找到目标节点 target

    2.找到目标节点的父节点parent 没有父节点:判断目标节点是有左子树还是右子树,root=target.left或root=target.right,用它唯一的子节点顶替自己的位置即可。有父节点,则:

    情况 3:待删节点左右子树都存在(最难)

    两种替换方案任选其一:

  • 取左子树最大值(左子树最右节点) 替换被删节点
  • 取右子树最小值(右子树最左节点) 替换被删节点
  • 原理:左最大、右最小的数字,放到当前位置依旧满足 BST 规则

    6. 获取最小值 / 最大值

    • 最小值:一路向左遍历到底(最左下角节点)
    • 最大值:一路向右遍历到底(最右下角节点)

    // 找最小值

    public Node getMin(Node root) {

        while(root.left != null) root = root.left;

        return root;

    }

    // 找最大值

    public Node getMax(Node root) {

        while(root.right != null) root = root.right;

        return root;

    }


    四、优缺点

    ✅ 优点:

  • 查找效率远超顺序数组;插入删除比有序数组方便
  • 中序遍历天然有序
  • ❌ 缺点:

  • 极端情况退化成链表,效率暴跌
  • 无法随机访问元素(不像数组可以按下标取值)

  • 赞(0)
    未经允许不得转载:171主机测评 » 有序二叉树
    分享到: 更多 (0)

    评论 抢沙发

    • 昵称 (必填)
    • 邮箱 (必填)
    • 网址