day21-数据结构(二叉树、二叉查找树、平衡二叉树、红黑树)

本文详细介绍了二叉树的基本概念、二叉查找树的特性和添加规则,以及二叉树的遍历方法,重点讲解了平衡二叉树(如红黑树)的平衡维护和节点添加过程中的规则调整。
摘要由CSDN通过智能技术生成

4.数据结构

4.1二叉树【理解】

  • 二叉树的特点

    • 二叉树中,任意一个节点的度要小于等于2
      • 节点: 在树结构中,每一个元素称之为节点
      • 度: 每一个节点的子节点数量称之为度
  • 二叉树结构图

    在这里插入图片描述

4.2二叉查找树【理解】

  • 二叉查找树的特点

    • 二叉查找树,又称二叉排序树或者二叉搜索树
    • 每一个节点上最多有两个子节点
    • 左子树上所有节点的值都小于根节点的值
    • 右子树上所有节点的值都大于根节点的值
  • 二叉查找树结构图

    在这里插入图片描述

  • 二叉查找树和二叉树对比结构图

    在这里插入图片描述

  • 二叉查找树添加节点规则

    • 小的存左边
    • 大的存右边
    • 一样的不存

    在这里插入图片描述
    在这里插入图片描述

  • 二叉查找树查找节点规则
    在这里插入图片描述

4.2二叉树遍历【理解】

  • 前序遍历:从根结点开始,然后按照当前结点,左子结点,右子结点的顺序遍历
    在这里插入图片描述
    在这里插入图片描述
  • 中序遍历:从最左边的子节点开始,然后按照左子结点,当前结点,右子结点的顺序遍历

在这里插入图片描述
在这里插入图片描述

  • 后序遍历:从最左边的子节点开始,然后按照左子结点,右子结点,当前结点的顺序遍历
    在这里插入图片描述
    在这里插入图片描述
  • 层序遍历:从最左边的子节点开始,然后按照左子结点,右子结点,当前结点的顺序遍历

在这里插入图片描述
在这里插入图片描述

小结

在这里插入图片描述

4.3平衡二叉树【理解】

在这里插入图片描述

  • 平衡二叉树的特点
    在这里插入图片描述

    • 二叉树左右两个子树的高度差不超过1
    • 任意节点的左右两个子树都是一颗平衡二叉树
  • 平衡二叉树旋转

    • 旋转触发时机

      • 当添加一个节点之后,该树不再是一颗平衡二叉树
    • 左旋步骤:

      • 第一种情况:支点没有左节点

        在这里插入图片描述
        在这里插入图片描述
        在这里插入图片描述
        在这里插入图片描述

        • 第二种情况:支点有左节点
          在这里插入图片描述
          在这里插入图片描述
          在这里插入图片描述
    • 右旋步骤

      • 第一种情况:如果支点右边没有节点

      在这里插入图片描述
      在这里插入图片描述
      在这里插入图片描述

      • 第二种情况:如果支点右边有节点
        在这里插入图片描述
        在这里插入图片描述
        在这里插入图片描述
  • 平衡二叉树旋转的四种情况

    • 左左

      • 左左: 当根节点左子树的左子树有节点插入,导致二叉树不平衡

      • 如何旋转: 直接对整体进行右旋即可
        在这里插入图片描述
        在这里插入图片描述
        在这里插入图片描述
        在这里插入图片描述

    • 左右

      • 左右: 当根节点左子树的右子树有节点插入,导致二叉树不平衡

      • 如何旋转: 先在左子树对应的节点位置进行左旋,在对整体进行右旋
        在这里插入图片描述
        如果直接对支点右旋,则旋转完后,还是不平衡:

        因此需要先把左子树左旋,然后整体右旋
        在这里插入图片描述
        在这里插入图片描述
        在这里插入图片描述
        在这里插入图片描述

    • 右右

      • 右右: 当根节点右子树的右子树有节点插入,导致二叉树不平衡

      • 如何旋转: 直接对整体进行左旋即可
        在这里插入图片描述
        在这里插入图片描述
        在这里插入图片描述

    • 右左

      • 右左:当根节点右子树的左子树有节点插入,导致二叉树不平衡

      • 如何旋转: 先在右子树对应的节点位置进行右旋,在对整体进行左旋

        在这里插入图片描述
        假如我们只选转一次:
        在这里插入图片描述
        因此还需要旋转两次,先旋转右子树,在旋转整体
        在这里插入图片描述
        在这里插入图片描述

      小结:

      在这里插入图片描述

4.3红黑树【理解】

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

  • 红黑树添加节点的默认颜色

    • 添加节点时,默认为红色,效率高
      • 如果默认是黑色的:在这里插入图片描述 添加18节点: 在这里插入图片描述
        添加18后,不符合红黑树规则第五条,即:对每一个节点,从该节点到其所有后代叶节点的简单路径上,均包含相同数目的黑色节点;
        此时,只需要把18变成红色,即可满足5个条件:
        在这里插入图片描述
        然后添加23节点
        在这里插入图片描述
        添加完成后,又不符合第5条规则,因此,把23变成红色:
        在这里插入图片描述
        综上所述,发现需要调整2次,
      • 如果默认是红色的:
        在这里插入图片描述
        在这里插入图片描述
        在这里插入图片描述
        在这里插入图片描述
        发现只调整了1次,因此添加节点默认是红色的效率高一点。
  • 红黑树添加节点后如何保持红黑规则
    在这里插入图片描述
    在这里插入图片描述

  • 添加20:
    在这里插入图片描述

  • 上图违背根节点必须是黑色,因此根节点变成黑色:
    在这里插入图片描述

  • 添加18
    在这里插入图片描述

  • 添加23
    在这里插入图片描述

  • 添加22:
    在这里插入图片描述

  • 上图违背第四个规则:两个红色节点不能相连,因此需要变换

    • 将父设置为黑色(即23设置为黑),将叔叔设置为黑色(即18设置为黑)
      在这里插入图片描述
    • 将祖父设置为红色(即20变为红色):
      在这里插入图片描述
    • 如果祖父为根,则将根变为黑色(即20变为黑色)
      在这里插入图片描述
  • 添加17节点:
    在这里插入图片描述

  • 添加24节点和19节点都是没问题的:
    在这里插入图片描述

  • 如果新增两个节点,继续添加到红黑树:
    在这里插入图片描述

  • 添加15节点:
    在这里插入图片描述

  • 上图违背两个红色节点不能相连的原则,需要变换:

    • 将父(17)设置为黑色,叔叔(19)设置为黑色,祖父节点(18)设为红色,现在祖父不是根节点,因此将祖父节点(18)设置为当前节点即(所添加元素的节点),继续判断:
      在这里插入图片描述

    • 18的父节点是黑色的,不需要任何操作,调整结束。
      在这里插入图片描述

  • 添加14节点:
    在这里插入图片描述

  • 上图违背了红色节点不能相连的规则,因此需要调整:

    • 将父(15)变为黑色,将祖父(17)变为红色
      在这里插入图片描述

    • 以祖父为支点进行右旋,旋转的时候,不需要考虑叶子节点,旋转完后,再把叶子结点补上就行了:
      在这里插入图片描述

  • 假如刚刚添加的不是14节点,而是16节点:
    在这里插入图片描述

  • 添加16节点:
    在这里插入图片描述

  • 添加完成后,不满足两个红色节点不能相连的规则,进行调整

    • 把父亲(15)当做当前节点,进行左旋,然后在进行判断
      在这里插入图片描述
    • 左旋完成后,还是不满足两个红色节点不能相连的规则,继续调整,以15为当前节点
      • 将父(16)变成黑色,将祖父(17)变成红色
        在这里插入图片描述

      • 以祖父节点(17)为支点,进行右旋
        在这里插入图片描述

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值