二叉树粗略复习笔记

二叉树

Ⅰ、插入与删除

删除采用中序遍历,找到待删除结点的后续结点,使其替换。

插入,空结点直接插入,如果值存在就失败

Ⅱ、平衡二叉树

最优情况下,二叉搜索树为完全二叉树,其平均比较次数为: l o g 2 N log_2 N log2N

最差情况下,二叉搜索树退化为单支树,其平均比较次数为: N 2 \frac{N}{2} 2N

优化与改进,为了防止(或近似)只有右子树或者只有左子树的情况,我们提出了AVL树,平衡二叉搜索树,它是一棵空树或它的左右两个子树的高度差的绝对值不超过1,并且左右两个子树都是一棵平衡二叉树。

Ⅲ、左旋与右旋

如何将其变成AVL树就成了研究的重点,哎这个知识点我一直没有空间想象力总之参考一下动图吧

https://blog.csdn.net/qq_25940921/article/details/82183093

Ⅳ、平衡二叉树小结

最后总结一下,平衡二叉树是一棵高度平衡的二叉树,所以查询的时间复杂度是 O(logN)插入的话上面也说,失衡的情况有4种,左左,左右,右左,右右,即一旦插入新节点导致失衡需要调整,最多也只要旋转2次,所以,插入复杂度是 O(1) ,但是平衡二叉树也不是完美的,也有缺点,从上面删除处理思路中也可以看到,就是删除节点时有可能因为失衡,导致需要从删除节点的父节点开始,不断的回溯到根节点,如果这棵平衡二叉树很高的话,那中间就要判断很多个节点。所以后来也出现了综合性能比其更好的树—-红黑树

Ⅴ、AVL树性能分析

AVL树是一棵绝对平衡的二叉搜索树,其要求每个节点的左右子树高度差的绝对值都不超过1,这样可以保证查询 时高效的时间复杂度,即 l o g 2 ( N ) log_2 (N) log2(N)。但是如果要对AVL树做一些结构修改的操作,性能非常低下,比如:插入时 要维护其绝对平衡,旋转的次数比较多,更差的是在删除时,有可能一直要让旋转持续到根的位置。因此:如果需 要一种查询高效且有序的数据结构,而且数据的个数为静态的(即不会改变),可以考虑AVL树,但一个结构经常修 改,就不太适合。

红黑树

Ⅵ、基本概念

  1. 每个结点不是红色就是黑色
  2. 根节点是黑色的
  3. 如果一个节点是红色的,则它的两个孩子结点是黑色的
  4. 对于每个结点,从该结点到其所有后代叶结点的简单路径上,均 包含相同数目的黑色结点
  5. 每个叶子结点都是黑色的(此处的叶子结点指的是空结点) 思考:为什么满足上面的性质,红黑树就能保证:其最长路径中节点个数不会超过最短路径节点个数的两倍

Ⅶ、红黑树应用
TreeMap、TreeSet底层使用的就是红黑树
·
Ⅷ、 AVL树和红黑树的比较
// 获取单条路径中节点的个数
int blackCount = 0;
RBTreeNode cur = root;
while(null != cur){
if(cur.color == COLOR.BLACK)
blackCount++;
cur = cur.left;
}
// 具体的检验方式
return _isValidRBtree(root, 0, blackCount);
}
private boolean _isValidRBtree(RBTreeNode root, int pathCount, int blackCount){
if(null == root)
return true;
// 遇到一个黑色节点,统计当前路径中黑色节点个数
if(root.color == COLOR.BLACK)
pathCount++;
// 验证性质三
RBTreeNode parent = root.parent;
if(parent != null && parent.color == COLOR.RED && root.color == COLOR.RED){
System.out.println(“违反了性质3:有连在一起的红色节点”);
return true;
}
// 验证性质四
// 如果是叶子节点,则一条路径已经走到底,检验该条路径中黑色节点总个数是否与先前统计的结果相同
if(root.left == null && root.right == null){
if(pathCount != blackCount){
System.out.println(“违反了性质4:路径中黑色节点格式不一致”);
return false;
}
}
// 以递归的方式检测root的左右子树
return _isValidRBtree(root.left, pathCount, blackCount) &&
_isValidRBtree(root.right, pathCount, blackCount);
}
红黑树和AVL树都是高效的平衡二叉树,增删改查的时间复杂度都是O( l o g 2 N log_2 N log2N),红黑树不追求绝对平衡,其只需保证最长路径不超过最短路径的2倍,相对而言,降低了插入和旋转的次数,所以在经常进行增删的结构中性能
比AVL树更优,而且红黑树实现比较简单,所以实际运用中红黑树更多。

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值