数据结构-树
数据结构--树
概念
树是一种递归定义的数据结构,是一种重要的非线性数据结构,树可以是一棵空树,它没有任何结点,也可以是一课非空树,至少含有一个结点。
相关术语
节点的度: 一个节点含有的子树的个数称为该节点的度。
叶节点或终端节点: 度为0的节点称为叶节点。
树的度: 一棵树中,最大节点的度称为树的度。
森林: 由m (m>0) 棵互不相交的树的集合称为森林。
遍历方式
前序遍历:
先访问根节点,再访问左子树,最后访问右子树
中序遍历:
先访问左子树,再访问根节点,最后访问右子树
后序遍历:
先访问左子树,再访问右子树,最后访问根节点
层序遍历:
每一层从左到右访问每一个节点。
举例说明:(以下面的二叉树来说明这四种遍历)
前序遍历:ABDFGHIEC
中序遍历:FDHGIBEAC
后序遍历:FHIGDEBCA
层序遍历:ABCDEFGHI
树的种类
二叉树
(1)二叉树是每个节点最多有两个子树的树结构;
(2)二叉树的子树有左右之分,次序不能颠倒;
(3)二叉树的第i层至多有2^{i-1}个结点;
(4)深度为k的二叉树至多有2^k-1个结点;
(5)对任何一棵二叉树T,如果其终端结点数为n0,度为2的结点数为n2,则n0=n2+1。
满二叉树:是深度为k,且有2^k-1个节点的二叉树。
完全二叉树:深度为k,有n个节点的二叉树,其每一个节点都与深度为k的满二叉树中,序号为1至n的节点对应。
AVL平衡二叉树:是一棵空树或它的左右两个子树的高度差的绝对值不超过1,并且左右两个子树都是一棵平衡二叉树。
线索二叉树:n个结点的二叉链表中含有n+1(2n-(n-1)=n+1)个空指针域。利用二叉链表中的空指针域,存放指向结点在某种遍历次序下的前趋和后继结点的指针(这种附加的指针称为"线索")。线索二叉树可分为前序线索二叉树、中序线索二叉树和后序线索二叉树三种。
二叉排序树:
(1)若左子树不空,则左子树上所有结点的值均小于它的根节点的值;
(2)若右子树不空,则右子树上所有结点的值均大于它的根结点的值;
(3)左、右子树也分别为二叉排序树;
(4)没有键值相等的节点。
哈夫曼树
哈夫曼树是一种最优二叉树,利用哈夫曼树寻找一颗最佳判定树,即总的比较次数最少的判定树。
所以,哈夫曼树中不存在结点度为1的结点。
哈夫曼树不是满二叉树,是正则二叉树(也叫正规二叉树),其中只有度为0和度为2的结点,因为n0 = n2 + 1,所以n个叶子的正则二叉树自然只有2n-1个结点。至于满二叉树当然也是正则二叉树的特例。
红黑树
AVL是严格平衡树,因此在增加或者删除节点的时候,根据不同情况,旋转的次数比红黑树要多;
红黑是弱平衡的,用非严格的平衡来换取增删节点时候旋转次数的降低;
所以简单说,搜索的次数远远大于插入和删除,那么选择AVL树,如果搜索,插入删除次数几乎差不多,应该选择RB树。
红黑树上每个结点内含五个域,color,key,left,right,p。如果相应的指针域没有,则设为NIL。
一般的,红黑树,满足以下性质,即只有满足以下全部性质的树,我们才称之为红黑树:
1)每个结点要么是红的,要么是黑的。
2)根结点是黑的。
3)每个叶结点,即空结点(NIL)是黑的。
4)如果一个结点是红的,那么它的俩个儿子都是黑的。
5)对每个结点,从该结点到其子孙结点的所有路径上包含相同数目的黑结点。
红黑树插入操作的平均时间复杂度为O(logn),最坏时间复杂度为O(logn);
B-树
是一种平衡多路搜索树(并不是二叉的):
1.定义任意非叶子结点最多只有M个儿子;且M>2;
2.根结点的儿子数为[2, M];
3.除根结点以外的非叶子结点的儿子数为[M/2, M];
4.每个结点存放至少M/2-1(取上整)和至多M-1个关键字;(至少2个关键字)
5.非叶子结点的关键字个数=指向儿子的指针个数-1;
6.非叶子结点的关键字:K[1], K[2], …, K[M-1];且K[i] < K[i+1];
7.非叶子结点的指针:P[1], P[2], …, P[M];其中P[1]指向关键字小于K[1]的
子树,P[M]指向关键字大于K[M-1]的子树,其它P[i]指向关键字属于(K[i-1], K[i])的子树;
8.所有叶子结点位于同一层;
B+ 树
B+树是B-树的变体,也是一种多路搜索树:
1.其定义基本与B-树同,除了:
2.非叶子结点的子树指针与关键字个数相同;
3.非叶子结点的子树指针P[i],指向关键字值属于[K[i], K[i+1])的子树
(B-树是开区间);
5.为所有叶子结点增加一个链指针;
6.所有关键字都在叶子结点出现;
如:(M=3)
B+的搜索与B-树也基本相同,区别是B+树只有达到叶子结点才命中(B-树可以在
非叶子结点命中),其性能也等价于在关键字全集做一次二分查找;
B+的特性:
1.所有关键字都出现在叶子结点的链表中(稠密索引),且链表中的关键字恰好
是有序的;
2.不可能在非叶子结点命中;
3.非叶子结点相当于是叶子结点的索引(稀疏索引),叶子结点相当于是存储
(关键字)数据的数据层;
4.更适合文件索引系统;比如对已经建立索引的数据库记录,查找10<=id<=20,那么只要通过根节点搜索到id=10的叶节点,之后只要根据叶节点的链表找到第一个大于20的就行了,比B-树在查找10到20内的每一个时每次都从根节点出发查找提高了不少效率。
B+树插入操作的平均时间复杂度O(logn),最坏时间复杂度为O(logn);