【Leetcode】114. 二叉樹展開爲鏈表

題目

給定一個二叉樹,原地將它展開爲鏈表。面試

例如,給定二叉樹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;
        }
    }
}
複製代碼

Leetcode名企之路
有問題加手撕代碼QQ羣討論:805423079
相關文章
相關標籤/搜索