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.
 * class TreeNode {
 *     public $val = null;
 *     public $left = null;
 *     public $right = null;
 *     function __construct($val = 0, $left = null, $right = null) {
 *         $this->val = $val;
 *         $this->left = $left;
 *         $this->right = $right;
 *     }
 * }
 */
class Solution {
    /**
     * @param TreeNode $root
     * @return NULL
     */
    function flatten($root) {
        if ($root != null) {
            $this->findTail($root);
        }
    }

    private function findTail($root) {
        $left = $root->left;
        $right = $root->right;
        $tail = null;
        // find the tail of left subtree, tail means the most left leaf
        if ($left != null) {
            $tail = $this->findTail($left);
            // stitch the right subtree below the tail
            $root->left = null;
            $root->right = $left;
            $tail->right = $right;
        } else {
            $tail = $root;
        }
        // find tail of the right subtree
        if ($tail->right == null) {
            return $tail;
        } else {
            return $this->findTail($tail->right);
        }
    }
}