简述树,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 ...
随机推荐
- HDU 5978 To begin or not to begin
题目:HDU 5978 To begin or not to begin 思路: 题目意思是说:给出n个黑球,一个红球,拿到红球的人胜利.如果先手有优势的输出 1 ,没有优势的输出 2 ,机会均等则输 ...
- Centos7下常见命令
1: hostnamectl set-hostname oldgirl 设置主机名直接生效 2: hostname oldboy (暂时生效,重启后恢复原来主机名)
- 三步教你实现MyEclipse的debug远程调试
MyEclipse远程调试程序是个神奇的东西,有时一个项目本地运行没问题可放到服务器上,同样的条件就是结果不一样:有时服务器上工程出点问题需要远程调测.于是就灰常想看一下程序在远程运行时候的状态,希望 ...
- python 3新式类的多继承
因为我用的是python3,所以所用到的类都是新式类,这里我说的都是新式类,python2类的继承复杂一些,主要有新式类和老式类.python3类(新式类)的继承是是广度优先(BFS),实例如下: c ...
- Django环境的搭建以及最简示例
一.环境的搭建 先安装pip yum install python-pip 安装失败: 安装epel扩展源 yum install epel-release 在安装pip 再利用pip安装django ...
- 搭建harbor企业级私有registry
主机环境要求 硬件Hardware Resource Capacity Description CPU minimal 2 CPU 4 CPU is prefered Mem minimal 4GB ...
- kendoUI 免费部分开发部分经验。
kendo分多个版本,核心UI免费版.NET,JAVA,PHP对应的前后端开发版. 基础免费版开放的UI经多个测试,与收费封装的UI并无区别,收费版提供了后端代码和前端封装语法,使不懂JS前端的也可简 ...
- 提升项目一:花卉管理系统(Servlet+JSP完成)
这个是写的第一个项目:使用Servlet+JSP完成,加上对底层构架的理解,才可以对后面要接触使用的ssh框架的深刻理解 2017-02-11: 完成对进货业务的操作, 下一步完成对销货业务的操作
- Nginx的四层和七层代理
理论部分: 所谓四层负载均衡,也就是主要通过报文中的目标地址和端口,再加上负载均衡设备设置的服务器选择方式,决定最终选择的内部服务器,它一般走的是tcp,udp协议 所谓七层负载均衡,也称为“内 ...
- 如何有效地报告Bug
英文原文:Simon Tatham,编译:Dasn 引言 为公众写过软件的人,大概都收到过很拙劣的bug报告,例如: 在报告中说“不好用”: 所报告内容毫无意义: 在报告中用户没有提供足够的信息: 在 ...