前端算法題解leetcode114二叉樹展開為鏈表
正文
題目地址
給你二叉樹的根結點 root
,請你將它展開為一個單鏈表:
- 展開後的單鏈表應該同樣使用
TreeNode
,其中right
子指針指向鏈表中下一個結點,而左子指針始終為null
。 - 展開後的單鏈表應該與二叉樹 先序遍歷 順序相同。
示例 1:
輸入: root = [1,2,5,3,4,null,6]
輸出: [1,null,2,null,3,null,4,null,5,null,6]
示例 2:
輸入: root = []
輸出: []
示例 3:
輸入: root = [0]
輸出: [0
提示:
- 樹中結點數在范圍
[0, 2000]
內 -100 <= Node.val <= 100
進階: 你可以使用原地算法(O(1)
額外空間)展開這棵樹嗎?
解題思路-基礎
本題要求我們把二叉樹拆成單鏈表,但是其實仍然是二叉樹,隻不過每個子樹隻有右子樹。
最簡單的辦法就是前序遍歷二叉樹,將節點放入數組,然後遍歷前序遍歷獲取到的節點數組,構造結果二叉樹。
代碼實現
function treeToList(root){ const list = [] function preorder(node){ if(node === null){ return } list.push(node) preorder(node.left) preorder(node.right) } preorder(root) return list } var flatten = function(root) { if(root === null){ return null } const list = treeToList(root) for(let i = 1;i<list.length;i++){ list[i-1].left = null list[i-1].right = list[i] } }
解題思路-進階
上面的解題思路可以完成解題,但是沒有達到本題進階的要求:使用原地算法(O(1)
額外空間)展開這棵樹。
想要達到進階的要求,就隻能使用常量的額外空間,這裡其實我們可以借用一個 current
變量指向當前正在處理的節點,同樣是前序遍歷,每次把當前節點掛到 current
的右子樹上,同時把 current
的左子樹置為 null
,防止出現循環引用,然後繼續處理後續節點,這樣當前序遍歷完成,就把二叉樹處理成瞭單鏈表狀態。
代碼實現
var flatten = function(root) { if(root === null){ return null } let current = {} function preorder(node){ if(node === null){ return } current.left = null current.right = node current = current.right const left = current.left const right = node.right preorder(left) preorder(right) } preorder(root) }
至此我們就完成瞭 leetcode-114-二叉樹展開為鏈表,更多關於前端算法二叉樹展開為鏈表的資料請關註WalkonNet其它相關文章!
推薦閱讀:
- C++實現LeetCode(114.將二叉樹展開成鏈表)
- Java二叉樹的四種遍歷(遞歸與非遞歸)
- C++實現LeetCode(101.判斷對稱樹)
- C++實現LeetCode(144.二叉樹的先序遍歷)
- C++實現LeetCode(156.二叉樹的上下顛倒)