前往
大廳
主題

LeetCode - 589. N-ary Tree Preorder Traversal 解題心得

Not In My Back Yard | 2020-11-30 00:00:03 | 巴幣 0 | 人氣 441

題目連結:


題目意譯:
給定一棵 n 元樹,回傳這棵樹的節點值之前序探訪(Preorder Traversal)。

n 元樹輸入序列化以它的階層探訪(Level-Order Traversal)表示,每組子節點以 null 值互相隔開(參見範例)。

進階:
遞迴解顯而易見,那你能使用迭代法做出來嗎?

限制:
n 元樹的高度 ≦ 1000
節點總數介於 [0, 10 ^ 4] 之間



範例測資:
範例 1:
輸入: root = [1,null,3,2,4,null,5,6]
輸出: [1,3,5,6,2,4]

範例 2:
輸入: root = [1,null,2,3,4,5,null,null,6,7,null,8,null,9,10,null,null,11,null,12,null,13,null,null,14]
輸出: [1,2,3,6,7,11,14,4,8,12,5,9,13,10]


解題思維:
這題有提及二元樹的前序探訪為:
根節點 → 左子樹 → 右子樹
而 n 元樹的則變更為
根節點 → 最左邊的子樹 → …… → 最右邊的子樹
因此直接仿照二元樹的版本即可,先看根節點再從左到右依序遞迴每個子樹。



而迭代的版本就是從根節點開始,而我們使用一個堆疊(Stack)儲存每個節點的子樹,但是要從右至左地將子節點放入堆疊之中。這樣從中移出元素時就會是盡量最左邊的子樹,才符合探訪的定義。

每移出一個元素就對應著原本遞迴子樹時的新根節點,而所有的子樹的根節點都會做一樣的事情。因此堆疊會一直增增減減,但是最後一定會變成空的。




此次分享到此為止,如有任何更加簡潔的想法或是有說明不清楚之地方,也煩請各位大大撥冗討論。

創作回應

更多創作