114. 二叉树展开为链表

中等 · 树

题目

114. 二叉树展开为链表 官方题解

方法一: 递归

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
/**
 * Definition for a binary tree node.
 * struct TreeNode {
 *     int val;
 *     TreeNode *left;
 *     TreeNode *right;
 *     TreeNode() : val(0), left(nullptr), right(nullptr) {}
 *     TreeNode(int x) : val(x), left(nullptr), right(nullptr) {}
 *     TreeNode(int x, TreeNode *left, TreeNode *right) : val(x), left(left), right(right) {}
 * };
 */
class Solution {
public:
    void flatten(TreeNode* root) {
        vector<TreeNode*> nodeList;
        preOrder(root, nodeList);
        int n = nodeList.size();

        for (int i = 1; i < n; i ++) {
            TreeNode *prev = nodeList.at(i - 1), *cur = nodeList.at(i);
            prev->left = nullptr;
            prev->right = cur;
        }
    }

    void preOrder(TreeNode* root, vector<TreeNode*>& nodeList) {
        if (root != nullptr) {
            nodeList.push_back(root);
            preOrder(root->left, nodeList);
            preOrder(root->right, nodeList);
        }
    }
};

时间复杂度:O(n)

空间复杂度:O(n)

方法二: 递归(优化空间)

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
/**
 * Definition for a binary tree node.
 * struct TreeNode {
 *     int val;
 *     TreeNode *left;
 *     TreeNode *right;
 *     TreeNode() : val(0), left(nullptr), right(nullptr) {}
 *     TreeNode(int x) : val(x), left(nullptr), right(nullptr) {}
 *     TreeNode(int x, TreeNode *left, TreeNode *right) : val(x), left(left), right(right) {}
 * };
 */
class Solution {
public:
    TreeNode* prev = nullptr;
    void flatten(TreeNode* root) {
        if (root == nullptr) return;

        flatten(root->right);
        flatten(root->left);

        root->right = prev;
        root->left = nullptr;
        prev = root;
    }
};

时间复杂度:O(n)

空间复杂度:O(n)(递归栈)

反前序遍历