简述树,Trie,Avl,红黑树
树的表示方法
在平时工作中通常有2种方式来表示树状结构,分别是孩子链表示法和父节点表示法。光说名词可能无法让人联系到实际场景中,但是写出代码之后大家一定就明白了。
孩子链表示法,即将树中的每个结点的孩子结点排列成一个线性表,用链表存储起来。对于含有 n 个结点的树来说,就会有 n 个单链表,将 n 个单链表的头指针存储在一个线性表中,这样的表示方法就是孩子表示法。
用代码展示即:
#define TElemType int
#define Tree_Size 100
//孩子表示法
typedef struct CTNode{
int child;//链表中每个结点存储的不是数据本身,而是数据在数组中存储的位置下标
struct CTNode * next;
}*ChildPtr;
typedef struct {
TElemType data;//结点的数据类型
ChildPtr firstchild;//孩子链表的头指针
}CTBox;
typedef struct{
CTBox nodes[Tree_Size];//存储结点的数组
int n,r;//结点数量和树根的位置
}CTree;
在存储方式上类似于

此种结构适合用于场景为:需要先出现父节点的场景,如:显示菜单,显示组织架构等。
父节点表示法,即取一块连续的内存空间,在存储每个结点的同时,各自都附加一个记录其父结点位置的变量。
用代码展示,即:
/* 树节点的定义 */
#define MAX_TREE_SIZE 100
typedef struct
{
TElemType data;
int parent; /* 父节点位置域 */
} PTNode;
typedef struct
{
PTNode nodes[MAX_TREE_SIZE];
int n; /* 节点数 */
} PTree;
在存储方式上类似于:

此结构适用于用在频繁查找父级节点的时候,如 溯源等。
在落地时,与写库相关用父级表示法,与读库相关用子级表示法,分库后用子级表示法。
简述线段树
定义:线段树是一个二叉树形状的数据结构,用于存储区间或者线段,并且允许快速查询结构内包含某一点的所有区间。
需要了解线段树,首先需要对前缀和,区间覆盖,区间加法,区间求和这几个概念有所了解。
简单来说,有这么两个线段,我要求7+8+9的时候只需要把上面这一条与下面这一条相减即可。

当然上面这个比较简单,下面进行一点升级,如图:

存储规则为第一项存第一项的值,第二项存前二项和,第三项存前三项和,以此类推。
这个时候当我要求7+8+9的时候 依然只需要将整条的值减去前6项和即可,即45-21。
简单白话来说即每一项内容都是一个集合,类似于上学期间学习的交并差集的感觉。
简述TRIE
TRIE,又称前缀树或字典树。是一种有序树,用于保存关联数组。详细定义参考维基百科定义,传送门
其形态类似于 
比如说要将以下文字构造为Trie
add a count for the part-include for example
核心规则如图所示:

文字版总结即:
1.添加一个空的root节点
2.从第一个单词第一个字母开始挨个排队从root穿过
3.当发现没有叫同一个字母的节点则开辟一条新的子节点
4.在单词最后一个字母的时候给节点打上标记,并记录次数
常用于词频分析,搜索提示等场景。
简述AVL
定义:在计算机科学中,AVL树是最早被发明的自平衡二叉查找树。在AVL树中,任一节点对应的两棵子树的最大高度差为1,因此它也被称为高度平衡树。查找、插入和删除在平均和最坏情况下的时间复杂度都是{\displaystyle O(\log {n})}。增加和删除元素的操作则可能需要借由一次或多次树旋转,以实现树的重新平衡。
节点带有平衡因子0,1,-1的节点可以认为满足了AVL。平衡因子为:左边与右边子树的高度/深度差就是这个节点的平衡因子。

如图所示,左边为非平衡树,右边为平衡树。
AVL平衡方式分为左旋和右旋。
左旋概念:
右旋概念:
简单理解就是向那边旋转就哪边的节点向下沉。
接下来稍微进阶一点点

此为右旋 ,操作可以类比为将2拽起来 ,将1沉下去, 在过程中 2与b的结构发生断裂 b变成了单身狗正好看见了A于是b为了脱单于是和1连上了。
同样的还有左旋如下图所示。

简述红黑树
红黑树(英语:Red–black tree)是一种自平衡二叉查找树,是在计算机科学中用到的一种数据结构,典型的用途是实现关联数组。维基百科传送门
规则如下:
1.节点是红色或者黑色.
2.根是黑色.
3.所有的叶子都是黑色
4.每个红色节点必须有两个黑色的子节点(其实就是3的一个推演)
5.从任意一个节点到每个叶子的所有简单路径都包含相同数目的黑色节点.(这一条涉及了图论..嗯..你简单认为就是,除了起点跟终点没有重复定点的道路就叫做简单道路)
6.每个叶子节点到根的我所有路径上不能有两个连续的红色节点
如图:

适合进行统计时使用。
落地举例
假定123456对应为月份的消费金额,节点上每一个代表下标区间

则可以很容易的统计出 这个用户在0-1月份消费了多少钱 ,3-5月份消费了多少钱等,应用线段树的概念可以很方便的统计出想统计的范围的结果。
如果使用红黑树的结构 则黑色的叶子节点可以认为是原始数据,红色节点可以认为是统计数据。
简述树,Trie,Avl,红黑树的更多相关文章
- 算法设计和数据结构学习_5(BST&AVL&红黑树简单介绍)
前言: 节主要是给出BST,AVL和红黑树的C++代码,方便自己以后的查阅,其代码依旧是data structures and algorithm analysis in c++ (second ed ...
- BST&AVL&红黑树简单介绍
(BST&AVL&红黑树简单介绍) 前言: 节主要是给出BST,AVL和红黑树的C++代码,方便自己以后的查阅,其代码依旧是data structures and algorithm ...
- 1.红黑树和自平衡二叉(查找)树区别 2.红黑树与B树的区别
1.红黑树和自平衡二叉(查找)树区别 1.红黑树放弃了追求完全平衡,追求大致平衡,在与平衡二叉树的时间复杂度相差不大的情况下,保证每次插入最多只需要三次旋转就能达到平衡,实现起来也更为简单. 2.平衡 ...
- 数据结构和算法(Golang实现)(29)查找算法-2-3树和左倾红黑树
某些教程不区分普通红黑树和左倾红黑树的区别,直接将左倾红黑树拿来教学,并且称其为红黑树,因为左倾红黑树与普通的红黑树相比,实现起来较为简单,容易教学.在这里,我们区分开左倾红黑树和普通红黑树. 红黑树 ...
- 从二叉查找树到平衡树:avl, 2-3树,左倾红黑树(含实现代码),传统红黑树
参考:自平衡二叉查找树 ,红黑树, 算法:理解红黑树 (英文pdf:红黑树) 目录 自平衡二叉树介绍 avl树 2-3树 LLRBT(Left-leaning red-black tree左倾红黑树 ...
- 从二叉搜索树到AVL树再到红黑树 B树
这几种树都属于数据结构中较为复杂的,在平时面试中,经常会问理解用法,但一般不会问具体的实现,所以今天来梳理一下这几种树之间的区别与联系,感谢知乎用户@Cailiang,这篇文章参考了他的专栏. 二叉查 ...
- 红黑树、B(+)树、跳表、AVL等数据结构,应用场景及分析,以及一些英文缩写
在网上学习了一些材料. 这一篇:https://www.zhihu.com/question/30527705 AVL树:最早的平衡二叉树之一.应用相对其他数据结构比较少.windows对进程地址空间 ...
- 红黑树与AVL树
概述:本文从排序二叉树作为引子,讲解了红黑树,最后把红黑树和AVL树做了一个比较全面的对比. 1 排序二叉树 排序二叉树是一种特殊结构的二叉树,可以非常方便地对树中所有节点进行排序和检索. 排序二叉树 ...
- AVL树与红黑树
平衡树是平时经常使用数据结构. C++/JAVA中的set与map都是通过红黑树实现的. 通过了解平衡树的实现原理,可以更清楚的理解map和set的使用场景. 下面介绍AVL树和红黑树. 1. AVL ...
随机推荐
- OpenGL 保存bmp图像
今天我们先简单介绍Windows中常用的BMP文件格式,然后讲OpenGL的像素操作.虽然看起来内容可能有点多,但实际只有少量几个知识点,如果读者对诸如”显示BMP图象”等内容比较感兴趣的话,可能不知 ...
- python语法基础-基础-控制语句
############### if条件控制语句 ############### # 以下实例 x 为 0-99 取一个数,y 为 0-199 取一个数,如果 x>y 则输出 x,如 ...
- 路由配置(route IP
转载于:http://blog.csdn.net/chenlycly/article/details/52141854 使用下面的 route 命令可以查看 Linux 内核路由表. # route ...
- URI和URL对比
URL是Uniform Resoure Locator(统一资源定位器)的缩写.就是WWW页的地址. 其URL地址格式排列为:scheme://host:Port/path --Internet资源类 ...
- spring security之Remember Me
spring-security.xml配置 环境: spring版本:5.0.7.RELEASE spring-security.xml引入: http://www.springframework.o ...
- python列表推导式(扫盲)
1) 简单了解: 所谓的列表推导式,就是指的轻量级循环创建列表. 格式: 列表推导式的常见形式: my_list = [ item for item in iterable] my_list: 列表名 ...
- Mac 环境docker 安装jenkins
网上很多的教程是讲的是Linux 上的Docker安装Jenkins,但是我用的是Mac,所以参考之前的前辈写的文章,记录一下自己的安装过程.非常感谢参考文章的前辈写的文章. 参考Docker安装Je ...
- Windows XP系列全下载(均为MSDN原版)
正版windows xp sp3 下载大全(附:正版密钥) 微软MSDN Windows XP Professional下载 Windows XP Professional 简体中文 (最原始版本,无 ...
- python字符串复制的几种方法
>>> list1 = [1,2] >>> id(list1) 50081032 >>> list2 = list1.copy() >> ...
- Alberto Del Bimbo:为什么说研究员要有想象力?
Del Bimbo:为什么说研究员要有想象力?" title="Alberto Del Bimbo:为什么说研究员要有想象力?"> 说到科研,与日本式的&q ...