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燈, 水草

請輸入看板名稱,例如:Soft_Job站內搜尋

TOP