树的表示方法

  在平时工作中通常有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,红黑树的更多相关文章

  1. 算法设计和数据结构学习_5(BST&AVL&红黑树简单介绍)

    前言: 节主要是给出BST,AVL和红黑树的C++代码,方便自己以后的查阅,其代码依旧是data structures and algorithm analysis in c++ (second ed ...

  2. BST&AVL&红黑树简单介绍

    (BST&AVL&红黑树简单介绍) 前言: 节主要是给出BST,AVL和红黑树的C++代码,方便自己以后的查阅,其代码依旧是data structures and algorithm ...

  3. 1.红黑树和自平衡二叉(查找)树区别 2.红黑树与B树的区别

    1.红黑树和自平衡二叉(查找)树区别 1.红黑树放弃了追求完全平衡,追求大致平衡,在与平衡二叉树的时间复杂度相差不大的情况下,保证每次插入最多只需要三次旋转就能达到平衡,实现起来也更为简单. 2.平衡 ...

  4. 数据结构和算法(Golang实现)(29)查找算法-2-3树和左倾红黑树

    某些教程不区分普通红黑树和左倾红黑树的区别,直接将左倾红黑树拿来教学,并且称其为红黑树,因为左倾红黑树与普通的红黑树相比,实现起来较为简单,容易教学.在这里,我们区分开左倾红黑树和普通红黑树. 红黑树 ...

  5. 从二叉查找树到平衡树:avl, 2-3树,左倾红黑树(含实现代码),传统红黑树

    参考:自平衡二叉查找树 ,红黑树, 算法:理解红黑树 (英文pdf:红黑树) 目录 自平衡二叉树介绍 avl树 2-3树 LLRBT(Left-leaning red-black tree左倾红黑树 ...

  6. 从二叉搜索树到AVL树再到红黑树 B树

    这几种树都属于数据结构中较为复杂的,在平时面试中,经常会问理解用法,但一般不会问具体的实现,所以今天来梳理一下这几种树之间的区别与联系,感谢知乎用户@Cailiang,这篇文章参考了他的专栏. 二叉查 ...

  7. 红黑树、B(+)树、跳表、AVL等数据结构,应用场景及分析,以及一些英文缩写

    在网上学习了一些材料. 这一篇:https://www.zhihu.com/question/30527705 AVL树:最早的平衡二叉树之一.应用相对其他数据结构比较少.windows对进程地址空间 ...

  8. 红黑树与AVL树

    概述:本文从排序二叉树作为引子,讲解了红黑树,最后把红黑树和AVL树做了一个比较全面的对比. 1 排序二叉树 排序二叉树是一种特殊结构的二叉树,可以非常方便地对树中所有节点进行排序和检索. 排序二叉树 ...

  9. AVL树与红黑树

    平衡树是平时经常使用数据结构. C++/JAVA中的set与map都是通过红黑树实现的. 通过了解平衡树的实现原理,可以更清楚的理解map和set的使用场景. 下面介绍AVL树和红黑树. 1. AVL ...

随机推荐

  1. pycharm中无法调用pip的安装包

    https://blog.csdn.net/sinat_23619409/article/details/79962518 较详细:https://blog.csdn.net/weixin_41287 ...

  2. highcharys去掉x轴,y轴轴线和刻度

    x轴 xAxis: { lineWidth :,//去掉x轴线 tickWidth:,//去掉刻度 labels: { enabled: false },//去掉刻度数字 }, y轴 yAxis: { ...

  3. php单例模式的常见应用场景

    单例模式(Singleton)也叫单态模式,是设计模式中最为简单的一种模式,甚至有些模式大师都不称其为模式,称其为一种实现技巧,因为设计模式讲究对象之间的关系的抽象,而单例模式只有自己一个对象,也因此 ...

  4. css3 - transform, transition 与 translate

    零.序言 css 3 的新特性,很多都停留在听说而非实际使用.transform, transition, translate 这三长得实在太像,刚开始的时候总是迷迷糊糊,分不清它们的功能.而最近新接 ...

  5. fiddler问题汇总

    fiddler教程:https://kb.cnblogs.com/page/130367/ fiddler下载安装:https://www.cnblogs.com/mini-monkey/p/1128 ...

  6. 吴裕雄--天生自然python学习笔记:Python3 数据结构

    列表 Python中列表是可变的,这是它区别于字符串和元组的最重要的特点,一句话概括即:列表可以修改,而字符串和元组不能. list.append(x) 把一个元素添加到列表的结尾,相当于 a[len ...

  7. mac 下openOffice服务的安装

    1.安装准备 安装 Homebrew 及 Homebrew-Cask Homebrew 是一个Mac上的包管理工具.使用Homebrew可以很轻松的安装缺少的依赖. Homebrew-Cask是建立在 ...

  8. zookeeper 客户端连接报: Will not attempt to authenticate using SASL

    解决方法:我在学习zk的时候,用客户端连接zk,发现接收不到watch通知,并且报 如图所示错误: 后查看服务没问题:图示 后查看防火墙状态,关闭防火墙 连接后正常: 如果查看防火墙状态是dead,s ...

  9. 印度IT产业今年裁员5.6万,自动化大潮下安有完卵

    [腾讯科技编者按]业界媒体Quatz撰文指出,对于印度科技从业者来说,2017年是噩梦连连的一年.直到几年前,IT业都还是印度提供就业岗位最多的行业之一,但在今年,这个1600亿美元规模的行业裁掉了5 ...

  10. Android入门(创建、编译、运行、打包、安装)

    一.创建Android项目 1.选择Emtpy Activity=>Next 2.配置项目 输入Name(名称) Package.name(包名) Save location(保存位置) Lan ...