树结构


1. 二叉树的度?

度概念:每个节点的子节点数即为度(故二叉树度 <= 2)
重要性质

  • 满二叉树:一棵深度为k,有2^k-1个节点的二叉树

  • 完全二叉树:除最后1层外,都是满的。最后一层可以缺,但只能缺右边

  • 二叉树中,第 m 层最多有 2^(m-1) 个结点(根结点为第一层)

  • 高度为k的二叉树至多有2^k - 1个结点

  • 二叉树 T 叶子结点总数为n0,度为2的结点个数为n2,则n0=n2+1

  • 如果完全二叉树有n个结点,那么树最高为log2(n)+1

  • 对于完全二叉树,从上至下,从左至右对每个结点从1-n编号,那么对于结点n有:

    如果i=1,那么此结点为根结点,如果i>1那么该结点的父结点为不大于i/2的最大整数;
    如果2i>n,那么i结点没有左子树,如果2i<=n那么该结点的左子树编号为2i;
    如果2
    i+1>n,那么结点i没有右子树,如果2i+1<=n那么该结点的右子树编号为2i+1。

2. AVL 树——(平衡二叉查找树)

AVL 树是平衡二叉查找树,增加和删除节点后通过树形旋转重新达到平衡。

  • 右旋:是以某个节点为中心,将它沉入当前右子节点的位置,而让当前的左子节点作为新树的根节点,也称为顺时针旋转。

  • 左旋:是以某个节点为中心,将它沉入当前左子节点的位置,而让当前的右子节点作为新树的根节点,也称为逆时针旋转。


3. 红黑树——(对称二叉B树 ,O(logn))

主要特征是在每个节点上增加一个属性表示节点颜色,可以红色或黑色红黑树和 AVL 树类似,都是在进行插入和删除时通过旋转保持自身平衡,从而获得较高的查找性能。与 AVL 树相比**,红黑树不追求所有递归子树的高度差不超过 1,保证从根节点到叶尾的最长路径不超过最短路径的 2 倍**,所以最差时间复杂度是 O(logn)红黑树通过重新着色和左右旋转,更加高效地完成了插入和删除之后的自平衡调整。

红黑树在本质上还是二叉查找树,它额外引入了 5 个约束条件

  • ① 节点只能是红色或黑色。
  • ② 根节点必须是黑色。
  • ③ 所有 NIL 节点都是黑色的。
  • ④ 一条路径上不能出现相邻的两个红色节点。
  • ⑤ 在任何递归子树中,根节点到叶子节点的所有路径上包含相同数目的黑色节点。

这五个约束条件保证了**红黑树的新增、删除、查找的最坏时间复杂度均为 O(logn)。如果一个树的左子节点或右子节点不存在,则均认定为黑色。红黑树的任何旋转在 3 次之内均可完成**。


4. AVL 树、红黑树区别

  • ① 自身性质的不同(平衡度、查找速度):红黑树的平衡性不如 AVL 树,它维持的只是一种大致的平衡,不严格保证左右子树的高度差不超过 1。这导致节点数相同的情况下,红黑树的高度可能更高,也就是说平均查找次数会高于相同情况的 AVL 树

  • ② 插入操作:红黑树和 AVL 树都能在至多两次旋转内恢复平衡

  • ③ 删除操作:由于红黑树只追求大致平衡,因此红黑树至多三次旋转可以恢复平衡,而 AVL 树最多需要 O(logn) 次。

  • ④ 操作复杂度:AVL 树在插入和删除时,将向上回溯确定是否需要旋转,这个回溯的时间成本最差为 O(logn),而红黑树每次向上回溯的步长为 2,回溯成本低。因此面对频繁地插入与删除红黑树更加合适


5. B 树、B+ 树区别

B 树中每个节点同时存储 key 和 data,而 B+ 树中只有叶子节点才存储 data,非叶子节点只存储 key。

InnoDB 对 B+ 树:进行了优化,在每个叶子节点上增加了一个指向相邻叶子节点的链表指针,形成了带有顺序指针的 B+ 树,提高区间访问的性能。

B+ 树的优点在于:

  • ① 由于 B+ 树在非叶子节点上不含数据信息,因此在内存页中能够存放更多的 key,数据存放得更加紧密,具有更好的空间利用率访问叶子节点上关联的数据也具有更好的缓存命中率

  • ② B+树的叶子结点都是相连的,因此对整棵树的遍历只需要一次线性遍历叶子节点即可。而 B 树则需要进行每一层的递归遍历,相邻的元素可能在内存中不相邻,所以缓存命中性没有 B+树好。

但是 B 树也有优点:由于每个节点都包含 key 和 value,因此经常访问的元素可能离根节点更近,访问也更迅速


  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值