计算机基础——树(Tree)

动态查找树主要有:
二叉查找树(Binary Search Tree,BST,二叉排序树)
平衡二叉树(Balanced Binary Search Tree,AVL树)
红黑树(Red-Black Tree,RB-Tree)
B-tree/B+tree/B*tree/B tree(多路平衡树)
前三者是典型的二叉查找树结构,其查找的时间复杂度O(log2N)与树的深度有关,树的深度越低,查找效率越高,越靠近O(logn)。

二叉查找树(二叉搜索树,BST)

二叉查找树就是左节点小于根节点,右节点大于根节点的一种排序树,
二叉查找树相比于普通二叉树,查找更快,查找,插入,删除删除的时间复杂度为O(logN)。但是二叉查找树,就是会变成一种线性链表似的结构。此时时间复杂度就变成了O(N),为了解决这种情况,出现了二叉平衡树。

二叉排序树的构建

同一个序列,选取不同的节点就有不同的二叉排序树,
1.任选一个数为根节点。
2.按顺序输入序列中的元素,比较元素与根节点大小,
3.如果大于,且根节点的右子树为空,则插入到有节点上,如果小于,且根节点左子树为空,则插入到左子树上。
4.递归。

二叉平衡树

平衡二叉树也叫AVL树,是一种自平衡树。
基于二叉排序树,还规定了左右子树高度相差不能超过1.保证了查找稳定,查找,插入,删除的时间复杂度都为O(logN),但是由于要维持自身的平衡,所以在插入和删除节点时,需要需要对结点进行频繁的旋转。

AVL树每一个节点只能存放一个元素,并且每个节点只有两个子节点。进行查找时,就需要多次磁盘IO,数据存放在磁盘中,每次查询是将磁盘中的每一页数据加入内存,树的每一层节点存放在一页中,不同层数据存放在不同页,这样如果需要多层查询就需要多次磁盘查询。为了解决这个问题就出现了B树。

平衡二叉树的调整

(1) LL型调整:节点左子树较高,新节点插入在节点的左子树的左子树。进行右旋转。
(2) RR型调整:节点右子树较高,新节点插入在节点的右子树的右子树。进行左旋转。
(3) LR型调整:节点左子树较高,新节点插入在节点的左子树的右子树。先进行左旋转,再进行右旋转。
(4) RL型调整:节点右子树较高,新节点插入在节点的右子树的左子树。先进行右旋转,再进行左旋转。

B树

什么是B树:也叫多路平衡树

1.根节点至少有两个子节点。
2.每个中间结点都包含k-1个元素和k个孩子,其中m/2<=k<=m。
3.每一个叶子节点都包含k-1个元素,其中m/2<=k<=m。
4.所有的叶子节点都在同一层
5.每个节点中的元素从小到大排列,节点当中k-1个元素正好是k个元素包含的元素的值域分划。

特点:

B树每一层存放了更多的节点,由AVL树的“瘦高”变成了“胖矮”。可以相对减少磁盘IO次数。MongoDB的索引就是用B树实现的。
B树也是一种自平衡树,在进行插入和删除操作时也需要对结点进行旋转等操作。
不过,B树查找不稳定,最好的情况就是在根节点查找到,最坏的情况就是在叶子节点查找到。另外,B树在遍历方面比较麻烦,由于需要进行中序遍历,所以也会进行一定数量的磁盘IO。为了解决这些问题,出现了B+树。

B-树

B-树也就是B树。

B+树

B+树的的几个规定:
1.有k个子树的中间结点包含有k个元素(B树是K-1个结点),每个元素不保存数据,只用来索引,所有数据保存在叶子结点。
2.所有的叶子节点中包含了全部元素的信息,及指向含有这些元素记录的指针,且叶子节点本身以关键字的大小自小而大顺序链接。
3.所有的中间结点元素都同时存放在于子节点,在子节点元素中是最大(最小)元素。

特点:

因为非叶子节点中存放的元素不存放元素,所以每一层可以容纳更多元素,额就是磁盘中每一项可以存储更多元素。这样在查找时,磁盘IO的次数也会减少。
另外,B+树的查找稳定,因为所有的数据都在叶子节点。每个叶子节点也通过指针指向构成了一种链表结构,,所以遍历数据也会变得简单很多。
B+树的插入和删除与B树类似。

红黑树

红黑树也叫RB-Tree
规定:
1.节点是红色或黑色
2.根节点是黑色
3.每个叶子节点都是黑色的空节点
4.每个红色节点的连个子节点都是黑色。也就是说每个叶子节点到跟的所有路径上不能有两个连续的红色节点。
5.从任意一节点到其余每个叶子节点的所有路径都包含相同数目的黑色结点。

特点:

红黑树在查找方面和avl树操作几乎相同。但是在插入和删除操作上,AVL树每次删除会进行大量的平衡度计算,红黑树是牺牲了严格的高度平衡的优越条件为代价,它只要求部分达到平衡,结合变色,降低了对旋转的要求,从而提高了性能。红黑树能够以O(log2n)的时间复杂度进行搜索,插入,删除操作。此外,由于他的设计,任何不平衡都会在三次旋转之类解决。

相比于BST,因为红黑树可以能够保证树的最长路径不大于两倍的最短路径的长度,所以可以看出查找效果是有最低保证的。在最坏的情况下也能保证O(logN),这是要好于二叉查找树的,因为二叉查找树最坏情况可以查找达到O(n)。

红黑树的算法时间复杂度和AVL相同,但统计性能比AVL树更高,AVL树在插入和删除中所做的后期维护操作可能会比AVL树耗时,所以红黑树应用还是高于AVL树的,实际上AVL树和红黑树的速度取决于你所插入的数据,如果数据分布较好,则比较易于采用AVL树(例如随机产生系列数),但是如果想要处理比较杂乱的情况,则红黑树比较快。

红黑树广泛用于TreeMap,TreeSet,以及jdk1.8后的HashMap。

最佳二叉树(Huffman Tree:哈弗曼树)

哈弗曼树的带权路径长度WPL为:叶子节点带权路径长度之和。
带权路径长度之和最小。

完全二叉树和满二叉树

满二叉树:每一层的节点都是满的
完全二叉树:除最后一层,所有节点靠左(可以只有有左节点),其余层节点都是满的。
堆就是一种完全二叉树

将树转化为二叉树

将树转化为二叉树是为了更高效地存储,所以为了保证树结构不被弄乱,每个树都有唯一对应的二叉树。
转化方式:
1.加线。在所有此工地节点之间加一条线
2.去线。对树中每个节点,只保留他与第一个孩子的连线,删除它与其他孩子的连线
3.层次调整。第一个孩子是节点的左孩子,兄弟节点转化过来的孩子是第一个孩子节点的右节点。
在这里插入图片描述

二叉树的存储方式

二叉树的存储方式一般有两种:顺序存储,链式存储
对于二叉树的存储,都是按照从上至下,从左至右,依次编号存储。
当时满二叉树时,使用顺序存储,
当二叉树节点高度差较大时,使用链式存储,
两种存储方式,都是为了节省存储空间

二叉树的遍历方式

先序遍历
中序遍历
后序遍历

直到先序和中序,中序和后续,都能确定唯一的二叉树。
知道先序和后续,不一定能确定二叉树。

二叉树节点的计算公式

1.n为节点个数,n0位叶子节点个数,n1位度为1的节点个数,n2位度为2的节点的数目,则有:

n = n0 + n1 + n2;

2.对于任意二叉树有:

n2 = n0 - 1;
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值