給定一個二叉樹,原地將它展開爲鏈表。面試
例如,給定二叉樹spa
1 / \ 2 5 / \ \ 3 4 6
將其展開爲:指針
1 \ 2 \ 3 \ 4 \ 5 \ 6
這算是比較經典的一道題目了, 博主面試快手的時候原題。最開始一想,以爲遞歸的求解不就行了,可是遞歸的時候發現須要注意一個地方就是:須要先遞歸右子樹,而後記錄下右子樹展開完成以後的鏈表頭。而後再遞歸的求解左子樹,把左子樹的最後一個鏈到右子樹的鏈表頭。基於這個,咱們用一個pre指針來記錄右子樹的頭結點。
code
class Solution { private TreeNode prev = null; public void flatten(TreeNode root) { if (root == null) return; flatten(root.right); flatten(root.left); root.right = prev; root.left = null; prev = root; } }
遞歸的方式轉換爲迭代的方式用stack就行了,反而比較好理解。遞歸
class Solution { public void flatten(TreeNode root) { if (root == null) return; Stack<TreeNode> stack = new Stack<TreeNode>(); stack.push(root); while (!stack.isEmpty()) { TreeNode current = stack.pop(); if (current.right != null) stack.push(current.right); if (current.left != null) stack.push(current.left); if (!stack.isEmpty()) current.right = stack.peek(); current.left = null; } } }
有問題加手撕代碼QQ羣討論:805423079rem