LeetCode in Racket

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.
#|

; val : integer?
; left : (or/c tree-node? #f)
; right : (or/c tree-node? #f)
(struct tree-node
  (val left right) #:mutable #:transparent)

; constructor
(define (make-tree-node [val 0])
  (tree-node val #f #f))

|#

(define/contract (flatten root)
  (-> (or/c tree-node? #f) void?)
  
  (define (find-tail root)
    (cond
      [(not root) root]
      [else
       (let ([left (tree-node-left root)]
             [right (tree-node-right root)])
         (if left
             (let ([tail (find-tail left)])
               ; Stitch right subtree below the tail
               (set-tree-node-left! root #f)
               (set-tree-node-right! root left)
               (when tail
                 (set-tree-node-right! tail right))
               ; Return final tail
               (if (and tail (tree-node-right tail))
                   (find-tail (tree-node-right tail))
                   tail))
             ; If no left subtree, current node is tail
             (if (tree-node-right root)
                 (find-tail (tree-node-right root))
                 root)))]))
  
  (when root
    (find-tail root))
  (void))