LeetCode-in-All

114. Flatten Binary Tree to Linked List

Medium

Given the root of a binary tree, flatten the tree into a “linked list”:

Example 1:

Input: root = [1,2,5,3,4,null,6]

Output: [1,null,2,null,3,null,4,null,5,null,6]

Example 2:

Input: root = []

Output: []

Example 3:

Input: root = [0]

Output: [0]

Constraints:

Follow up: Can you flatten the tree in-place (with O(1) extra space)?

Solution

/**
 * Definition for a binary tree node.
 * struct TreeNode {
 *     int val;
 *     struct TreeNode *left;
 *     struct TreeNode *right;
 * };
 */
struct TreeNode* flattenAux(struct TreeNode* root) {
    if (root == NULL) {
        return NULL;
    }

    if ((root->right == NULL) && (root->left == NULL)) {
        return root;
    }

    struct TreeNode *pR = root->right;
    struct TreeNode *pll = NULL;
    struct TreeNode *plr = NULL;

    if (root->left != NULL) {
        root->right = root->left;
        pll = flattenAux(root->left);
        root->left = NULL;
    }

    if (pR != NULL) {
        plr = flattenAux(pR);
    }

    if (pll != NULL) {
        pll->right = pR;
    }

    if (plr != NULL) {
        return plr;
    }

    return pll;
}

void flatten(struct TreeNode* root) {
    flattenAux(root);
}