Medium
Given the root
of a binary tree, flatten the tree into a “linked list”:
TreeNode
class where the right
child pointer points to the next node in the list and the left
child pointer is always null
.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:
[0, 2000]
.-100 <= Node.val <= 100
Follow up: Can you flatten the tree in-place (with O(1)
extra space)?
import { TreeNode } from '../../com_github_leetcode/treenode'
/*
* Definition for a binary tree node.
* class TreeNode {
* val: number
* left: TreeNode | null
* right: TreeNode | null
* constructor(val?: number, left?: TreeNode | null, right?: TreeNode | null) {
* this.val = (val===undefined ? 0 : val)
* this.left = (left===undefined ? null : left)
* this.right = (right===undefined ? null : right)
* }
* }
*/
/**
Do not return anything, modify root in-place instead.
*/
const flatten = (root: TreeNode | null): void => {
if (root === null || (root.left === null && root.right === null)) {
return
}
const vals: Array<number> = []
const stack: Array<TreeNode> = []
let next: TreeNode | null | undefined = root
while (0 < stack.length || next != null) {
while (next != null) {
stack.push(next)
vals.push(next.val)
next = next.left
}
next = stack.pop()
next = next?.right
}
let newHead: TreeNode | null = null
let newTail: TreeNode | null = null
for (let val of vals) {
if (newHead == null) {
newHead = new TreeNode(val)
newTail = newHead
continue
}
if (newTail != null) {
newTail.right = new TreeNode(val)
newTail = newTail.right
}
}
if (newHead != null) {
root.left = null
root.val = newHead?.val
root.right = newHead.right
}
}
export { flatten }