zoukankan      html  css  js  c++  java
  • 数据结构:二叉树、平衡二叉树、红黑树详解

    一、 二叉树(binary tree)

    指每个节点最多含有两个子树的树结构。时间复杂度为O(log N),在退化成链表的情况下时间复杂度为O(N)。

    特点:

    1.所有节点最多拥有两个子节点;

    2.节点的左子树只包含小于当前根节点的数,节点的右子树只包含大于当前根节点的数。

    缺点: 只会以我们第一次添加的节点为根节点,如果后面添加的节点值都大于或小于根节点的值,在这种情况下会退化成链表。

    二、 平衡二叉树(Balanced Binary Tree)

    又称为AVL树,具有二叉树的全部特性,解决二叉树退化成链表情况的问题,每个节点的左子树和右子树的高度之差不会超过1,AVL树是严格的 平衡二叉树,追求完全平衡,比较严格。
     
    缺点: 由于要求每个节点的左子树和右子树高度之差不超过1,这个要求非常严格,追求完全平衡,这就导致了在频繁插入和删除的场景中, 可能就会导致AVL树失去平衡,AVL树就需要频繁的通过左旋右旋使其重新达到平衡,这时就会时得其性能大打折扣。
     
     

    三、红黑树

    和AVL树相比,红黑树放弃追求完全平衡,而是追求大致平衡,保证每次插入节点最多只需要三次旋转就能达到平衡,维持平衡的耗时较少,实现起来也更为简单,它的旋转次数较少, 对于频繁插入和删除操作的场景,相比AVL树,红黑树更具优势。
     
    特征:
    1.红黑树是也是平衡二叉树实现的一种方式
    2.节点只能是黑色或者红色,root根节点一定是黑色
    3.新增时默认新增的节点是红色,不允许两个红色节点相连
    4.红色节点的两个子节点一定是黑色
     

    红黑树变换规则

    三种规则:

    1.改变节点颜色

    2.左旋转

    3.右旋转

    变色的情况:

    当前节点的父亲节点是红色,并且它的祖父节点的另外一个子节点(叔叔节点)也是红色:以当前节点为指针进行操作

    1.将父亲节点变为黑色

    2.将叔叔节点变为黑色

    3.将祖父节点变为红色

    4.再把指针定义到祖父节点进行旋转操作

    左旋转: 当父亲节点为红色情况,叔叔节点为黑色情况,且当前节点是右子树,左旋转以父节点作为左旋。

    右旋转: 当父亲节点为红色情况,叔叔节点为黑色情况,且当前节点是左子树,右旋转以父节点作为右旋:

    1.将父节点变为黑色

    2.将祖父节点变为红色

    3.以祖父节点开始旋转

  • 相关阅读:
    Apache Druid 的集群设计与工作流程
    跨越算法开篇
    十分钟了解Apache Druid(集数据仓库、时间序列、全文检索于一体的存储方案)
    时间序列数据库(TSDB)初识与选择(InfluxDB、OpenTSDB、Druid、Elasticsearch对比)
    C#多线程(6):线程通知
    C#多线程(5):资源池限制
    C#多线程(4):进程同步Mutex类
    C#多线程系列(3):原子操作
    C#多线程系列(2):多线程锁lock和Monitor
    C#多线程系列(1):Thread
  • 原文地址:https://www.cnblogs.com/boris-et/p/14756677.html
Copyright © 2011-2022 走看看