数据结构之树

树的种类:

二叉树、二叉查找树、平衡二叉树、平衡搜索树之AVL树,自平衡二叉树之红黑树、多路搜索树之B树、B+树、B*树、Trie树等;

二叉树:

是树家族最基础的结构;

每个节点至多只有两颗子树,子树分左右不能颠倒;

第i层至多有2^(i-1)个节点;

深度为k的二叉树至多有2^(k-1)个节点;


满二叉树:

除叶子结点外,每一层上的所有节点都有两个子节点;

节点数达到最大值,都塞满了;

所有叶子结点必须在同一层上;


完全二叉树

若设二叉树的深度h,除h层外其它层节点数都达到最大个数,第h层所有节点集中在最左边;

(注:完全二叉树是效率很高的,堆是一种完全二叉树或近似,所以效率极高,像常用的排序算法,Dijkstra算法、prim算法都要用堆才能优化,二叉排序树的侠侣也要借助平衡性来提高,而平衡性基于完全二叉树。具有n个结点的完全二叉树的深度为log2(n+1);


二叉查找树二叉排序树二叉搜索树、Binary sort tree):

若左子树不空,则左子树所有节点的值均小于根节点;

若右子树不空,则右子树所有节点的值均大于等于根节点;

左右子树也分别为二叉排序树;

没有键值相等的节点;

(二叉查找树的性质:对儿茶排序树做中序遍历即可得到有序数列;时间复杂度和二分查找一样,插入和查找的时间复杂度均为O(logn),最坏的情况仍然有O(n),原因是插入和删除时没有保持平衡。二叉排序树的高度决定了其查找效率。)

二叉查找树的插入过程如下:

1) 若当前的二叉查找树为空,则插入的元素为根节点;

  2) 若插入的元素值小于根节点值,则将元素插入到左子树中;

  3) 若插入的元素值不小于根节点值,则将元素插入到右子树中。

二叉查找树的删除,分三种情况进行处理:

  1) p为叶子节点,直接删除该节点,再修改其父节点的指针(注意分是根节点和不是根节点);

  2) p为单支节点(即只有左子树或右子树)。让p的子树与p的父亲节点相连,删除p即可(注意分是根节点和不是根节点);

  3) p的左子树和右子树均不空。找到p的后继y,因为y一定没有左子树,所以可以删除y,并让y的父亲节点成为y的右子树的父亲节点,并用y的值代替p的值;

或者方法二是找到p的前驱x,x一定没有右子树,所以可以删除x,并让x的父亲节点成为y的左子树的父亲节点。


平衡二叉树(Balanced Binary Tree,又AVL树

一颗空树或左右两个子树的高度差不超过1;

左右子树都是平衡二叉树;


平衡查找树AVL树

AVL树是最先发明的自平衡二叉查找树;

AVL树最关键的也是最难的一步操作就是旋转,自平衡操作;

旋转主要是为了实现AVL树在实施了插入和删除操作以后,树重新回到平衡的方法。

单旋转、双旋转;


平衡二叉树之红黑树

一种自平衡二叉树;

红黑树和AVL树一样,都对插入、删除和查找时间提供了最好可能的最坏情况担保。

二叉平衡树的严格平衡策略,以牺牲建立查找结构(插入,删除操作)的代价,换来了稳定的O(logN) 的查找时间复杂度  。 

1、节点是红色或黑色。

2、根是黑色。

3、所有叶子都是黑色(叶子是NIL节点)。

4、每个红色节点必须有两个黑色的子节点。(从每个叶子到根的所有路径上不能有两个连续的红色节点。)

5、从任一节点到其每个叶子的所有简单路径都包含相同数目的黑色节点。

注: 确保了,从根到叶子的最长的可能路径不多于最短的可能路径的两倍长。

因为每一个红黑树也是一个特化的二叉查找树,因此红黑树上的只读操作与普通二叉查找树上的只读操作相同。

然而,在红黑树上进行插入操作和删除操作会导致不再符合红黑树的性质。恢复红黑树的性质需要少量(O(logn))的颜色变更(实际是非常快速的)和不超过三次树旋转(对于插入操作是两次)。

虽然插入和删除很复杂,但操作时间仍可以保持为O(logn) 次。


B树(多路搜索树

一种用于查找的平衡树,但是它不是二叉树。

一种多路搜索树,以拥有多于2个子节点。

所有的叶子结点都位于同一层。

与自平衡二叉查找树不同,B-树为系统最优化大块数据的读和写操作。

B-tree算法减少定位记录时所经历的中间过程,从而加快存取速度。这种数据结构常被应用在数据库和文件系统的实作上。


B+树

B+树是B树的变体,也是一种多路搜索树:

1) 其定义基本与B-树相同,除了:

   2) 非叶子结点的子树指针与关键字个数相同;

   3) 非叶子结点的子树指针P[i],指向关键字值属于[K[i], K[i+1])的子树(B-树是开区间);

   4) 为所有叶子结点增加一个链指针;

   5) 所有关键字都在叶子结点出现;

B+树的搜索与B树也基本相同,区别是B+树只有达到叶子结点才命中(B树可以在非叶子结点命中),

其性能也等价于在关键字全集做一次二分查找;


B*树
B+树的变体,在B+树的非根和非叶子结点再增加指向兄弟的指针
将结点的最低利用率从1/2提高到2/3。
B*树分配新结点的概率比B+树要低,空间使用率更高。


Tire树

字典树,又称单词查找树;一种哈希树的变种。

典型应用是用于统计,排序和保存大量的字符串(但不仅限于字符串),所以经常被搜索引擎系统用于文本词频统计。

它的优点是:利用字符串的公共前缀来减少查询时间,最大限度地减少无谓的字符串比较,查询效率比哈希树高。 

Tire树的三个基本性质:
  1) 根节点不包含字符,除根节点外每一个节点都只包含一个字符;
  2) 从根节点到某一节点,路径上经过的字符连接起来,为该节点对应的字符串;
  3) 每个节点的所有子节点包含的字符都不相同。
应用:
串的快速检索、“串”排序、最长公共前缀;


红黑树和平衡二叉树区别如下: 
1、红黑树放弃了追求完全平衡,追求大致平衡,在与平衡二叉树的时间复杂度相差不大的情况下,

保证每次插入最多只需要三次旋转就能达到平衡,实现起来也更为简单。 

2、平衡二叉树追求绝对平衡,条件比较苛刻,实现起来比较麻烦,每次插入新节点之后需要旋转的次数不能预知。

小结:
B-树:多路搜索树,每个结点存储M/2到M个关键字,非叶子结点存储指向关键字范围的子结点;
所有关键字在整颗树中出现,且只出现一次,非叶子结点可以命中;
B+树:在B-树基础上,为叶子结点增加链表指针,所有关键字都在叶子结点中出现,非叶子结点作为叶子结点的索引;
B+树总是到叶子结点才命中;
B*树:在B+树基础上,为非叶子结点也增加链表指针,将结点的最低利用率从1/2提高到2/3;









评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值