題目連結:
題目意譯:
給定一棵 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)儲存每個節點的子樹,但是要從右至左地將子節點放入堆疊之中。這樣從中移出元素時就會是盡量最左邊的子樹,才符合探訪的定義。
每移出一個元素就對應著原本遞迴子樹時的新根節點,而所有的子樹的根節點都會做一樣的事情。因此堆疊會一直增增減減,但是最後一定會變成空的。
此次分享到此為止,如有任何更加簡潔的想法或是有說明不清楚之地方,也煩請各位大大撥冗討論。