二叉树
Jan 28, 2021 11:37 · 34 words · 1 minute read
完全二叉树存储在数组中时,所有元素可以根据根元素的下标地址计算得出,所以完全二叉树适合用数组存储
堆就是一种完全二叉树,最常用的存储方式就是数组
二叉树的遍历
前中后序遍历指的是根节点的遍历顺序,左节点一定在右节点之前遍历
二叉查找树
利用二叉树的结构,并赋予左小右大的特性来储存数据
查找
递归思路查找
插入
递归思路找到父节点,并插入为叶子节点
删除
没有子节点:直接删除
有一个子节点:将父节点指向自己的指针指向子节点
有两个或子节点:找到右子树中最小的节点(必没有左节点),将这个节点删除并替换自己,这个节点的删除操作参见上两种方法
平衡二叉查找树
二叉查找树最好状态是一颗完全二叉树,最坏状态是一个链表
平衡二叉树的严格定义是这样的:二叉树中任意一个节点的左右子树的高度相差不能大于 1。从这个定义来看,上一节我们讲的完全二叉树、满二叉树其实都是平衡二叉树,但是非完全二叉树也有可能是平衡二叉树。
平衡二叉查找树不仅满足上面平衡二叉树的定义,还满足二叉查找树的特点。
平衡二叉查找树与散列表
- 散列表不支持按顺序区间遍历,需要额外数据结构(链表等)支持
- 散列表由于散列冲突的存在,装载因子不能太大,会浪费一定空间。同时散列冲突会导致散列表的性能不稳定
- 散列表在扩容时需要开辟新空间,转移新旧数据等,查找性能与空间使用都不太稳定
红黑树
红黑树是最常用的平衡二叉查找树。他通过几个定义,保证了自己的最大高度是2*logn
- 根节点是黑色的;
- 每个叶子节点都是黑色的空节点(NIL),也就是说,叶子节点不存储数据;
- 任何相邻的节点都不能同时为红色,也就是说,红色节点是被黑色节点隔开的;
- 每个节点,从该节点到达其可达叶子节点的所有路径,都包含相同数目的黑色节点;
由来: 解决二叉查找树性能退化的问题
特性:近似平衡,最大高度是O(logn)
适用场景:动态插入删除查找的场景,同时对性能稳定性要求高
缺点:实现比较复杂,可以用跳表替代