数据结构之树

树的定义(这是一种递归定义):

树是由n个节点组成的有限集合T,其中n>=0。特别的,若n=0,称为空树,如果n>0则T应满足的条件是:
1. 有一个特定的称为根(root)的节点,它只有直接后继,没有前驱。
2. 除根以外的其它节点被划分为m个互不相交的有限集合T1,T2,...,Tm,其中m>=0,每个集合又是一颗树,并且称为根的子树。每棵子树的根节点有且仅有一个直接前驱,但可以有0个或多个直接后继。

如上图,子集T1={B,D,E},T2={C,F}是两个互不相交的子集,它们既为A的子树。树中亦包含递归结构,例如子树T1中,B又是其根节点,而且除了根节点B之外的其它节点又被分为2个互不相交的子集:T11={D},T12={E}。它们2个都是只有一个根节点的树,没有子树。

相关术语

节点的度:一个节点含有的子树的个数称为该节点的度;

叶节点或终端节点:度为0的节点称为叶节点;

非终端节点或分支节点:度不为0的节点;

叶子节点:一棵树当中没有子结点(即度为0)的结点称为叶子结点;

双亲节点或父节点:若一个节点含有子节点,则这个节点称为其子节点的父节点;

孩子节点或子节点:一个节点含有的子树的根节点称为该节点的子节点;

兄弟节点:具有相同父节点的节点互称为兄弟节点;

树的度:一棵树中,最大的节点的度称为树的度;

节点的层次:从根开始定义起,根为第1层,根的子节点为第2层,以此类推;

树的高度或深度:树中节点的最大层次;

堂兄弟节点:双亲在同一层的节点互为堂兄弟;

节点的祖先:从根到该节点所经分支上的所有节点;

子孙:以某节点为根的子树中任一节点都称为该节点的子孙。

森林:由m(m>=0)棵互不相交的树的集合称为森林;

树的种类

数据结构中有很多树的结构,其中包括二叉树、二叉搜索树、2-3树、红黑树等等。本文中对数据结构中常见的几种树的概念和用途进行了汇总,不求严格精准,但求简单易懂。

二叉树

二叉树是数据结构中一种重要的数据结构,也是树表家族最为基础的结构。

二叉树的定义:二叉树的每个结点至多只有二棵子树(不存在度大于2的节点),二叉树的子树有左右之分,次序不能颠倒。

满二叉树

一颗树深度为h,最大层数为k,深度与最大层数相同,k=h;
叶子数为2h;
第k层的结点数是:2^k-1;;
总结点数是:2^k-1,且总节点数一定是奇数。    

完全二叉树

如果一个二叉树与满二叉树前m个节点的结构相同,这样的二叉树被称为完全二叉树 

二叉排序树

任何节点的键值一定大于其左子树中的每一个节点的键值,并小于其右子树中的每一个节点的键值。 

二叉树排序前序、中序、后序

流程图

二叉树排序(根节点和孩子结点,子树是指最子的叶子结点)
前序:遍历顺序为,根节点、前序遍历左子树、前序遍历右子树;
中序:遍历顺序为,中序遍历左子树、根节点、中序遍历右子树;
后序:遍历顺序为,后序遍历左子树左子树、后序遍历左子树右子树、根节点 

如上图的根为A ,左子树为(bde), 右子树为(cf),
前序(根左右),a 再对左子树进行前序就是(b,d,e), 再对右边子树就是cf
中序(左根右),左子树为中序就是(dbe),a ,右子树中序就是(fc) 
后序(左右根),左子树后续就是(deb),右边子树就是(fc) a  

如上图的根为1 ,左子树为(24678), 右子树为(35),
前序(根左右),1 再对左子树进行前序就是(2,4,678,), 再对右边子树就是(35)
中序(左根右),左子树为中序就是(4,768,2),1 ,右子树中序就是(35) 
后序(左右根),左子树后续就是(786,4,2),右边子树就是(53) 1

B-树

我们知道二叉查找树查询的时间复杂度是O(logN),查找速度最快和比较次数最少,既然性能已经如此优秀,
但为什么实现索引是使用B-Tree而不是二叉查找树,关键因素是磁盘IO的次数, 减少磁盘IO的次数就必须要压缩树的高度,
让瘦高的树尽量变成矮胖的树,所以B-Tree就在这样伟大的时代背景下诞生了。
m阶B-Tree满足以下条件:
1、每个节点最多拥有m个子树
2、根节点至少有2个子树
3、分支节点至少拥有m/2颗子树(除根节点和叶子节点外都是分支节点)
4、所有叶子节点都在同一层、每个节点最多可以有m-1个key,并且以升序排列

B+树

B+Tree是B树的变种,有着比B树更高的查询性能,来看下m阶B+Tree特征:
1、有m个子树的节点包含有m个元素(B-Tree中是m-1)
2、根节点和分支节点中不保存数据,只用于索引,所有数据都保存在叶子节点中。
3、所有分支节点和根节点都同时存在于子节点中,在子节点元素中是最大或者最小的元素。
4、叶子节点会包含所有的关键字,以及指向数据记录的指针,并且叶子节点本身是根据关键字的大小从小到大顺序链接。

B+Tree与B-Tree区别

非叶子结点的子树指针与关键字个数相同;
非叶子结点的子树指针P[i],指向关键字值属于[K[i], K[i+1])的子树(B-树是开区间);
为所有叶子结点增加一个链指针;
内节点不存储data,只存储key;叶子节点不存储指针
所有关键字都在叶子结点出现;

为什么数据索引用B+tree


1、更加高效的单元素查找,与二叉树相比可以大幅度减少IO次数,与B树相比,因为B+树的数据都是存在叶子节点的,
所以同样大小的磁盘页可以容纳更多的节点元素
2、叶子节点形成有顺链表,范围查找性能更优
比如查询3到8的数据,如果是二叉树或者b树,io次数会远大于B+树

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值