C_and_CPP 板


LINE

第一次PO板,可能写的不尽详细or不完整.... 假设两儿子的高度差为 正数 or 0 找出旋转点:先从刚插入的节点往root的方向,依序往上找, 直到找到节点的两个儿子高度差为2 则此节点的爸爸以上,高度差皆 >= 2 此节点的儿子以下,高度差皆 <= 1 再判断此节点与刚刚节点插入的方向(就是LL LR那四种的某一种) 依插入的方向,可以找出三个节点, 依二元树特性,可以找出这三节点的大小关系, 而这三个节点,会连接四个节点,依小到大,我用红黄绿蓝四色代表。 找好之後,开始作旋转。 旋转:将需要作旋转的三个节点,依二元树的特性,列出大中小三个值 而中间的值往上搬成为父点,小的值与大的值变成中间值的两个儿子 接下来比较难的就是旋转前三个节点的四个儿子(红黄绿蓝四个节点) 此四个节点(红 < 黄 < 绿 < 蓝)依图例, 红色接到最小值的左儿子(因为红色是最小的), 黄色接到最小值的右儿子(次小) 绿色接到最大值的左儿子(次大) 蓝色接到最大值的右儿子(因为最大) 按照这种规则就可以实作出来了, 我会利用从插入的节点往回找高度差的原因是因为, 这样子就不用每插入一次,就要整棵树parse一次, 再者,旋转只会与那三个需要旋转的点有关, 旋转完之後,并不需要再计算整棵树每个节点的高度差, 因为旋转一次,整棵树就会平衡了。(horowitz课本後面好像有证明的样子) │ │ ╭─╮        │← 以此点的"左右儿子高度差"为2        ╰─╯ (他儿孙的高度差皆为1或0,        他爸爸、爷爷往上,皆大於等於2)   ╭─╮        ╭─╮  ││      │ │  ╰─╯       ╰─╯       / \     /   \ ╭─╮   ╭─╮ ╭─╮   ╭─╮ │ │  ││ │ │   │ │ ╰─╯  ╰─╯ ╰─╯   ╰─╯ / \ / \ / \ ○ ○ ○ ○○ ○ ○ ○ ← 假设插入的节点在这边, 由此节点往上开始比较爸爸的左右两儿子高度差 if ( 爸爸的左右儿子高度差 >= 1 ) then 记录此点, 并判断 此点 与 插入节点 的关系, 即 LL or LR or RL or RR, 开始做旋转!! else 继续找爸爸的爸爸, 直到找到第一个高度差为2的节点, 或是找到root都没有高度差为2,则结束!             │ │ │ │ ╭─╮ 经LR旋转後     ╭─╮      │======>   ││      ╰─╯   ╰─╯       / \ /   \   ╭─╮        ╭─╮ ╭─╮   ╭─╮  ││      ││ ││   ││  ╰─╯       ╰─╯ ╰─╯   ╰─╯       / \     /   \ ╭─╮   ╭─╮ ╭─╮   ╭─╮ │  ││ │ │   │ │ ╰─╯  ╰─╯ ╰─╯   ╰─╯ / \ / \ / \ ○ ○ ○ ○ ○ ○ 剩下LL RL (RR我就没有画了,因为差不多) 爷 │ 父 │ ╭─╮      ││      ╰─╯        ╭─╮        ╭─╮  ││      │ │  ╰─╯       ╰─╯  \       / \   \ /   \ ╭─╮   ╭─╮ ╭─╮   ╭─╮ ││  │ │ │ │   │ │ ╰─╯  ╰─╯ ╰─╯   ╰─╯ / \ / \ / \ ○ ○ ○ ○○ ○ ○ ○ ↖ ↑ ↖↑ 不管插在哪一边,皆都是LL型 !! 爷 │ 父 │ ╭─╮      ││      ╰─╯      /     ╭─╮        ╭─╮  │ │      ││  ╰─╯       ╰─╯ / \       /   \ /   \ ╭─╮   ╭─╮ ╭─╮   ╭─╮ │ │  │ │ ││   │ │ ╰─╯  ╰─╯ ╰─╯   ╰─╯ / \ / \ / \ ○ ○ ○ ○○ ○ ○ ○ ↖ ↑ ↖↑ 不管插在哪一边,皆都是RL型 !! ※ 引述《drkkimo (Dr.K)》之铭言: : 我想这算是蛮常被提到的一种东西吧 不过老实说 我对它的资料插入和删除後 要作的 : 调整真的搞不太懂 看到二、三本书吧 都分成LL、LR、RR、LR型调整之类的 但还是不很 : 了解 … : 请问有没有人知道那里有比较完整的实作 或是比较清楚的解说呢 因为我最近想把它弄懂  : 可否指点一下呢 thx:) --



※ 发信站: 批踢踢实业坊(ptt.cc)
◆ From: 61.229.230.7
1F:推 qrtt1:推...好图就要推..xd 01/31 21:29
※ 编辑: iamomygod 来自: 61.229.230.7 (01/31 21:31)
3F:→ gwliao:AVL%20tree%20applet.htm 两行并在一起看. 01/31 22:25
4F:→ gwliao:http://www.cs.fiu.edu/~weiss/dsaajava/code/ 01/31 22:26
5F:→ gwliao:DataStructures/AvlTree.java 也是两行并一行看 01/31 22:27
6F:→ gwliao:Weiss的书的code, 有动画有code应该比较好了解. :) 01/31 22:28
7F:推 WalkingIce:好精彩啊!! 02/01 11:10
8F:推 drkkimo:thx:) 再好好研究.. 02/01 16:01







like.gif 您可能会有兴趣的文章
icon.png[问题/行为] 猫晚上进房间会不会有憋尿问题
icon.pngRe: [闲聊] 选了错误的女孩成为魔法少女 XDDDDDDDDDD
icon.png[正妹] 瑞典 一张
icon.png[心得] EMS高领长版毛衣.墨小楼MC1002
icon.png[分享] 丹龙隔热纸GE55+33+22
icon.png[问题] 清洗洗衣机
icon.png[寻物] 窗台下的空间
icon.png[闲聊] 双极の女神1 木魔爵
icon.png[售车] 新竹 1997 march 1297cc 白色 四门
icon.png[讨论] 能从照片感受到摄影者心情吗
icon.png[狂贺] 贺贺贺贺 贺!岛村卯月!总选举NO.1
icon.png[难过] 羡慕白皮肤的女生
icon.png阅读文章
icon.png[黑特]
icon.png[问题] SBK S1安装於安全帽位置
icon.png[分享] 旧woo100绝版开箱!!
icon.pngRe: [无言] 关於小包卫生纸
icon.png[开箱] E5-2683V3 RX480Strix 快睿C1 简单测试
icon.png[心得] 苍の海贼龙 地狱 执行者16PT
icon.png[售车] 1999年Virage iO 1.8EXi
icon.png[心得] 挑战33 LV10 狮子座pt solo
icon.png[闲聊] 手把手教你不被桶之新手主购教学
icon.png[分享] Civic Type R 量产版官方照无预警流出
icon.png[售车] Golf 4 2.0 银色 自排
icon.png[出售] Graco提篮汽座(有底座)2000元诚可议
icon.png[问题] 请问补牙材质掉了还能再补吗?(台中半年内
icon.png[问题] 44th 单曲 生写竟然都给重复的啊啊!
icon.png[心得] 华南红卡/icash 核卡
icon.png[问题] 拔牙矫正这样正常吗
icon.png[赠送] 老莫高业 初业 102年版
icon.png[情报] 三大行动支付 本季掀战火
icon.png[宝宝] 博客来Amos水蜡笔5/1特价五折
icon.pngRe: [心得] 新鲜人一些面试分享
icon.png[心得] 苍の海贼龙 地狱 麒麟25PT
icon.pngRe: [闲聊] (君の名は。雷慎入) 君名二创漫画翻译
icon.pngRe: [闲聊] OGN中场影片:失踪人口局 (英文字幕)
icon.png[问题] 台湾大哥大4G讯号差
icon.png[出售] [全国]全新千寻侘草LED灯, 水草

请输入看板名称,例如:iOS站内搜寻

TOP