📌算法Go语言描述📌treestruct📌0-常用的树结构.txt
二叉查找树(Binary-Search-Tree),又称二叉排序树(Binary-Sort-Tree)或二叉搜索树。
它是一棵二叉树或者空树。
左子树的所有结点的值都小于它的根结点,右子树所有结节的点都大于它的根结点。
左右子树也分别是二叉查找树。
中序遍历可以得到一个结点值递增的有序序列。
二叉查找树的高度决定了二叉查找树的查找效率。
平衡二叉树(Balanced-Binary-Tree或Height-Balanced-Tree),又称为AVL树,是一棵严格自平衡的二叉查找树。
左子树和右子树的深度之差的绝对值不超过1。
左子树和右子树也是平衡二叉树。
每次插入和删除平衡二叉树的结点后,都可能导致平衡二叉树失去平衡,需要旋转调平。
B树(Balance-Tree),是一棵多路平衡查找树。描述一颗B树时需要指定它的阶数,表示一个结点最多有多少个孩子结点,一般用字母m表示。
一棵m阶的B-树,或为空树,或为满足下列特性的m叉树:
根结点最少可以只有1个关键字。非根结点至少有Math.ceil(m/2)-1个关键字,最多有m-1个关键字。
每个结点中的关键字都按照从小到大的顺序排列,每个关键字的左子树中的所有关键字都小于它,而右子树中的所有关键字都大于它。
所有叶子结点都位于同一层,或者说根结点到每个叶子结点的长度都相同。
B+树是基于B树的一种变体,也是一种多路查找树。
有n个子树的结点中含有n个关键字。
所有的叶子结点中包含了全部的关键字信息,以及指向含这些关键字记录的指针,且叶子结点本身按照关键字的大小自小到大顺序连接。
所有的非叶子结点可以看成索引的一部分,结点中仅含有其子树(根结点)中的最大或者最小的关键字。
B+树的优势:
单一结点存储更多的元素,使得查询的IO次数更少。
所有查询都要查找到叶子结点,查询性能稳定。
所有叶子结点形成有序链表,便于范围查询。
B*树是B+树的变体,在B+树的非根和非叶子结点再增加指向兄弟的指针,将结点的最低利用率从1/2提高到2/3。
红黑树(Red-Black-Tree)是一种自平衡二叉查找树,红黑树降低了平衡性要求,达到局部平衡。
结点是红色或黑色。
根结点是黑色。
所有叶子都是黑色(叶子是NIL结点)。
每个红色结点必须有两个黑色的子结点。(从每个叶子到根的所有路径上不能有两个连续的红色结点。)
从任一结点到其每个叶子的所有路径都包含相同数目的黑色结点。
红黑树与AVL树的区别:
AVL(平衡二叉树)的查询性能更高,因为AVL比红黑树更加严格平衡(AVL调平的频次较高);
红黑树的插入和删除的速度更快,因为调整的频次较低,甚至不需要调整;
AVL需要在每个节点增加一个整数来记录左右子树的高度差;而红黑树的每个节点只需要使用一个布尔值标志其是红或黑。
字典树(TireTree)又称单词查找树或键树,是一种用于快速检索的多叉树结构。
根结点不包含字符,除根结点外每一个结点都只包含一个字符;
从根结点到某一结点,路径上经过的字符连接起来,为该结点对应的字符串;
每个结点的所有子结点包含的字符都不相同。
优点:利用字符串的公共前缀来减少查询时间,最大限度地减少无谓的字符串比较,查询效率比哈希树高。
后缀树(SuffixTree)是一棵压缩字典树,后缀树中存储的关键词为所有的后缀。后缀树是前缀树里的一个特殊类型。
AVL树在windows对进程地址空间的管理被使用到。
B树常用于磁盘管理系统中的目录管理,以及数据库系统中的索引。
B+树更适合做文件索引系统,比如MySQL的InnoDB的索引底层就是使用B+树。
红黑树可以用作实现set和map的基础数据结构,常用于操作系统的进程调度、内存管理等场景。
Trie树常用于字符串匹配、文本搜索、自动补全、拼写检查等场景。