数据结构之树

借鉴必须放到前面

**概念:**树是由结点或者顶点和变组成的(可能是非线性的),且不存在任何环状的一种数据结构。没有结点的树称为空树(null或者empty 树)。一颗非空的树包括一个根节点,还有很多个附加结点,所有结点构成一个多级分层结构。

1、二叉树

概念:
每个结点至多拥有两颗子树(即二叉树中不存在大于两个结点的子树),并且二叉树的子树有左右之分,其次序不能任意颠倒
性质:

  1. 若二叉树的层次从0开始,则二叉树的第i层最多拥有2^i个结点(i>=0 )
  2. 高度为k的二叉树,最多有2^(k+1) - 1 个结点
  3. ***对任何一棵二叉树,如果其叶子结点数为m(度为0),度为2的结点数为n,则m=n+1***不懂

二叉树又分为:完美二叉树,完全二叉树,完满二叉树
完美二叉树
完美二叉树
完全二叉树
完全二叉树
完满二叉树
完满二叉树
区别:

树名内容
完美二叉树除了叶子结点之外的每一个结点都有两个孩子,每一层(包括最后一层)都被完全填充
完全二叉树除了最后一层之外的其他每一层都被完全填充,并且所有结点都保持向左对齐
完满二叉树除了叶子结点之外的每一个结点都有两个孩子结点

二叉树遍历法

  1. 先序遍历:即根-左-右遍历
  2. 中序遍历:即左-根-右遍历,对于给定的二叉树根,寻找其左子树;对于其左子树的根,再去寻找其左子树;递归遍历,直到寻找最左边的结点i,其必然为叶子,然后遍历i的父节点,在遍历i的兄弟结点,随着递归的逐渐出栈,最终完成遍历
  3. 后序遍历:即左-右-根遍历

2、红黑树

一种自平衡二叉查找树,通过对任何一条从根到叶子的路径上各个结点着色的方式的限制,红黑树确保从根到叶子结点的最长路径不会是最短路径的两倍,用非严格的平衡来换取增删结点时候旋转次数的降低,任何不平衡都会在三次旋转之内解决。
使用场景:
红黑树多用于搜索、插入、删除操作多的情况下
广泛的用在C++的STL中。map和set都是红黑树的实现
著名的linux进程调度Completely Fair Scheduler,用红黑树管理进程控制块。
epoll在内核中的实现,用红黑树管理事件块
nginx中,用红黑树管理timer等
原因: 红黑树的查询性能略微逊色于AVL树,因为比AVL树会稍微不平衡最多一层,也就是说红黑树的查询性能只比相同内容的AVL树最多多一次比较,但是,红黑树在插入和删除上完爆AVL树,AVL树每次插入删除会进行大量的平衡度计算,而红黑树为了维持红黑性质所做的红黑变换和旋转的开销,相较于AVL树为了维持平衡的开销要小得多。
性质:
节点是红色或黑色。
根节点是黑色。
每个叶子节点都是黑色的空节点(NIL节点)。
每个红色节点的两个子节点都是黑色。(从每个叶子到根的所有路径上不能有两个连续的红色节点)
从任一节点到其每个叶子的所有路径都包含相同数目的黑色节点。

3、AVL树

AVL树是带有平衡条件的二叉查找树,和红黑树相比,它是严格的平衡二叉树,平衡条件必须满足(所有节点的左右子树高度差不超过1).不管我们是执行插入还是删除操作,只要不满足上面的条件,就要通过旋转来保持平衡,而旋转是非常耗时的。
使用场景:
AVL树适合用于插入删除次数比较少,但查找多的情况。 也在Windows进程地址空间管理中得到了使用 旋转的目的是为了降低树的高度,使其平衡
AVL树特点: AVL树是一棵二叉搜索树 AVL树的左右子节点也是AVL树 AVL树拥有二叉搜索树的所有基本特点 每个节点的左右子节点的高度之差的绝对值最多为1,即平衡因子为范围为[-1,1]

4、B树

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值