常用算法 25 讲
胡光
前百度高级算法研发工程师,ACM 国际大学生程序设计大赛亚洲区金牌获得者
40774 人已学习
赠一得一
登录后,你可以任选4讲全文学习
课程目录
已完结/共 31 讲
结束语 (1讲)
常用算法 25 讲
15
15
1.0x
00:00/00:00
登录|注册

15 | AVL树:如何让二叉排序树永远保持最优?

在极端情况下,利用二叉排序树解决第 k 大问题时,尽管它有最优的求解算法,代价依旧不低。这时,我们可以使用 AVL 树来解决。
确认放弃笔记?
放弃后所记笔记将不保留。
新功能上线,你的历史笔记已初始化为私密笔记,是否一键批量公开?
批量公开的笔记不会为你同步至部落
公开
同步至部落
取消
完成
0/2000
荧光笔
直线
曲线
笔记
复制
AI
  • 深入了解
  • 翻译
    • 英语
    • 中文简体
    • 中文繁体
    • 法语
    • 德语
    • 日语
    • 韩语
    • 俄语
    • 西班牙语
    • 阿拉伯语
  • 解释
  • 总结
该试读文章来自《常用算法 25 讲》,如需阅读全部文章,
请先通过赠一得一解锁课程
赠一得一
登录 后留言

全部留言(11)

  • 最新
  • 精选
  • 思成
    请问老师,调整平衡的时候,需要对每课子树都判断平衡因子并调整平衡吗?文中的示例代码能做到这点吗,我理解示例代码是不是只多做了下一级子树的平衡判断?

    编辑回复: 因为AVL树的调整是自底而上逐层调整的,所以每次只需要向下判断一级

    3
  • 惜昔
    老师说的要经过两次旋转才能平衡的看的不明白

    编辑回复: 这位同学你好,我举个例子,如果需要用左旋的话,原右子树的左子树会直接继承到新的左子树,那如果不平衡是由这个子树导致的,则左旋没有办法将不平衡的树高差消掉,所以要先把右子树的左子树的树高先给抹掉,所以要旋转两次,具体可以多看几次双旋的case

    2
    1
  • norton/Dark
    这么复杂的算法竟然看明白了,作者功底扎实,建议多出个算法实战专栏
    4
  • 刘旺旺
    感觉越来越难了,慢慢啃,加油
    2
  • 宋不肥
    之前一直觉得avl太高大上,没想到avl的代码这么简单,仔细一想逻辑确实是这样,也是因为老师讲得好嗷,但感觉左右旋转的图的中间部分那个画的有问题,不应该有三个分支,实际上已经变成两个数了,利用tmp存了字树的指针,又合并在一起的,希望能改进一下
    1
  • Mona432
    太棒了!期待作者更多的优秀专栏
    1
  • 陈阳
    图2和图3中的 ‘2 号节点的任意一个孩子都可以放到 4 号节点的左孩子位置。’这端描述有问题, 应该是2号节点的右子树的任意一个孩子都可以放到4号节点的左孩子位置
  • Geek_de2717
    老师课后练习的答案是不是文稿里已经给了?就是这段代码中的 if (H(L(root)) > H(R(root))) { 部分 //AVL树调整平衡 Node *maintain(Node *root) { if (abs(H(L(root)) - H(R(root))) <= 1) return root; if (H(L(root)) > H(R(root))) { if (H(R(L(root))) > H(L(L(root)))) { root->lchild = left_rotate(root->lchild); } root = right_rotate(root); } else { if (H(L(R(root))) > H(R(R(root)))) { root->rchild = right_rotate(root->rchild); } root = left_rotate(root); } return root; }
  • Liao Pei
    把 P 当作 J 的左子树,T2​ 剩余的节点当作 J 的右子树,再把 P 的父亲当作 J 的父亲 既然P是J的左子树,为什么又能共享一个父亲呢
  • 微风漂过
    update_height()函数是如何实现的?
    1
收起评论
显示
设置
留言
11
收藏
沉浸
阅读
分享
手机端
快捷键
回顶部