看板 C_and_CPP 關於我們 聯絡資訊
1 10 11 100 101 110 111 1000 1001 1010 1011 1100 1101 1110 1111 根據這棵樹的定義,一個點 (x) 的兩個子節點分別為 (2x) 和 (2x + 1) 或是 (x << 1) 和 ((x << 1) + 1) ,也就是說,一個點的子節點有著和自己一樣的開頭 Ex: 2 (10) 的子節點是 4 (100) 和 5 (101) ,開頭都是 10 而且, xxx0 一定是 xxx 的左子節點, xxx1 一定是 xxx 的右子節點 再來看走訪的順序:對每個子樹都是先走左邊再走右邊再走左邊...... 以 1 來說,從他出發往下走,一定是 10..., 11..., 10..., 11... 換句話說, 第奇數個球一定是掉在 10... 這個終端節點, 第偶數個球一定是掉在 11... 這個終端節點 再換句話說, (I - 1) 的最後一個 bit 就是終端節點的第二個 bit (第一個 bit 一定是 1) 再來看看第二層,先看 10 這個節點,從他往下走一定是 100..., 101..., 100..., 101... 而從 11 往下走一定是 110..., 111..., 110..., 111... 我們看一下 (I - 1):當 (I - 1) 是 ...0 的時候,終端節點是 10... (I - 1) = ...00: 10 這個節點是 false ,往左走 => 100... (I - 1) = ...10: 10 這個節點是 true ,往右走 => 101... (I - 1) = ...0 的時候也類似, 我們可以歸納出 (I - 1) 的倒數第二個 bit 就是終端節點的第 3 個 bit 再來就是用歸納法, 已知 (I - 1) 的倒數第 1 ~ k 個 bit 是終端節點的第 2 ~ (k + 1) 個 bit 那 (I - 1) 的倒數第 k + 1 個 bit 是終端節點的第 k + 2 個 bit。 所以,把 (I - 1) 的 bit 倒過來排,最前面再補一個 1 ,就是終端節點的編號 -- ※ 發信站: 批踢踢實業坊(ptt.cc) ◆ From: 140.112.49.204
Biboy:講解的好清楚! 終於弄懂這是如何觀察出來的了! 謝謝! 05/03 20:34