二叉树
类型
- 普通二叉树:
- 满二叉树:每个节点都有左右两个子节点
- 完全二叉树:叶子节点都在最底下两层,最后一层的叶子节点都靠左排列,并且除了最后一层,其他层的节点个数都要达到最大
搜索与遍历
- 深度优先搜索
前序遍历:根左右
中序遍历:左根右
后序遍历:左右根 - 广度优先搜索
层次遍历:分层左右遍历所有节点
二叉查找树
- 二叉查找树:二叉树中最常用的一种类型,是为了实现快速查找的,不仅仅支持快速查找一个数,还支持快速插入和删除数据。
- 特性:在树中的任意一个节点,其左子树中的每个节点的值,都要小于这个节点的值,而右子树节点的值都要大于这个节点的值。
- 总结:
- 二叉查找树可以支持快速插入、删除、查找操作,各个操作的时间复杂度与树的高度成正比;
- 最理想情况下,时间复杂度是O(logn);
- 但在极端情况下,比如频繁的删除等操作,二叉树会退化成一个链表,那么时间复杂度就变成了O(n)。
平衡二叉查找树
为了避免二叉查找树的缺陷问题,设计出一种平衡二叉树。
- 平衡二叉树:即任何节点的左右子树高度相差不超过 1
- 总结:
- 平衡二叉查找树的高度接近 logn,所以插入、删除、查找操作的时间复杂度也比较稳定,是 O(logn)。
- 每次在插入或者删除的时候,为了符合平衡二叉树严格的条件,需要进行一些操作来进行调整,比如左旋、右旋等操作,使其再次符合平衡二叉树的条件。
- 频繁的插入和删除操作会导致算法大量时间花费在平衡二叉树的调整上,导致算法效率的大幅下降。
红黑树
为了避免平衡二叉树在频繁更新过程中,所带来的维持树结构的时间消耗,从而引入了红黑树。
- 红黑树:是一个近似平衡的二叉树,它的定义如下:
- 具有二叉查找树的特点;
- 根节点是黑色的;
- 每个叶子节点都是黑色的空节点(NIL),也就是说,叶子节点不存数据;
- 任何相邻的节点都不能同时为红色,也就是说,红色节点是被黑色节点隔开的;
- 每个节点,从该节点到达其可达的叶子节点是所有路径,都包含相同数目的黑色节点。