→ donkilu: 討論下去就要去softjob板啦XD 04/08 14:43
抱歉佔用版面QQ 如不符版規請告知
推 TAMSHUI: 討論串還不錯欸,學到很多XD 04/08 19:38
推 Ninja5566: 他是說建樹 不是 traverse 04/08 19:55
推 sdriver: 你講的是另一題,traverse tree’s inorder with iterati 04/08 21:13
→ sdriver: on 04/08 21:13
推 icecastleo: 稍微改一下樹不就建起來了嗎 04/09 00:13
推 Ninja5566: 建樹是另外一回事, 除非你另外存在struct不然node不 04/09 00:44
→ Ninja5566: 知道自己的parent還有自己是左子還右子 04/09 00:44
推 icecastleo: ...我們討論的是complete binary tree 04/09 02:18
我的確看錯了原本推文的意思,但這仍是可行的
首先,Tree Node可以包含parent, left, right三個指標
這裡有些trade-off,例如:
* 不放parent省空間,但中序走訪會如果要O(1) space就要O(N*log(N)) time
* 放了parent比較佔空間,但中序走訪會是O(N) time, O(1) space
此外許多tree mutating (e.g. rotate) 沒有parent pointer很難做
大多數實作(E.g. SGI STL)包含了parent
這是我們每天日常使用iterator over a tree的背後實作
剩下就是把tree traversal改成同時走訪array-based tree
一樣,順手寫了一下(帶簡單測試),code talks
https://pastebin.com/Jfwq6TL8
O(N) time. 不算新建的樹的話O(1) space.
→ jatj: 建樹還是要o(log(N))吧 04/09 02:37
建樹至少要O(N),因為要寫N個elements
→ jatj: 我是指暫存 04/09 05:41
推 Ninja5566: 他說省下queue的空間, 你其實也是做一樣的事情, 只是 04/09 06:43
→ Ninja5566: 把空間移到struct而已 04/09 06:43
→ Ninja5566: 換句話講人家用BFS用queue,而 你用不同方式紀錄ptr而已 04/09 06:45
※ 編輯: yzugsr (24.5.73.164), 04/09/2019 09:42:58
→ jatj: 建樹當然至少要O(N) 04/09 10:07
→ shaform: 如果是指暫存,不計樹本身,那jennya的for loop 應該較好? 04/09 23:43