給定一個二叉樹,原地將它展開爲鏈表。面試
例如,給定二叉樹bash
1
/ \
2 5
/ \ \
3 4 6
複製代碼
將其展開爲:ui
1
\
2
\
3
\
4
\
5
\
6
複製代碼
這算是比較經典的一道題目了, 博主面試快手的時候原題。最開始一想,以爲遞歸的求解不就行了,可是遞歸的時候發現須要注意一個地方就是:須要先遞歸右子樹,而後記錄下右子樹展開完成以後的鏈表頭。而後再遞歸的求解左子樹,把左子樹的最後一個鏈到右子樹的鏈表頭。基於這個,咱們用一個pre指針來記錄右子樹的頭結點。spa
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羣討論:805423079