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
#     attr_accessor :val, :left, :right
#     def initialize(val = 0, left = nil, right = nil)
#         @val = val
#         @left = left
#         @right = right
#     end
# end
# @param {TreeNode} root
# @return {Void} Do not return anything, modify root in-place instead.
def flatten(root)
  return if root.nil?

  find_tail(root)
end

private

def find_tail(root)
  left = root.left
  right = root.right
  tail = nil

  # find the tail of the left subtree, tail means the most left leaf
  if left
    tail = find_tail(left)

    # stitch the right subtree below the tail
    root.left = nil
    root.right = left
    tail.right = right
  else
    tail = root
  end

  # find tail of the right subtree
  return tail if tail.right.nil?

  find_tail(tail.right)
end