Binary Tree Level Order Traversal II

LeetCode July - Day 2

Problem Statement

Given a binary tree, return the bottom-up level order traversal of its nodes’ values. (ie, from left to right, level by level from leaf to root).

For example: Given binary tree [3,9,20,null,null,15,7],

    3
   / \
  9  20
    /  \
   15   7

return its bottom-up level order traversal as:

[
  [15,7],
  [9,20],
  [3]
]

Inputs, Outputs, Constraints & Exceptions

  • I: TreeNode<val, left, right>
  • O: array<array>
  • C: none/optimise
  • E: root has no children, root is null

PseudoCode

levelOrderBottom(root):
  define level = new Map()
  define queue = []
  push root to queue
  set level[root] = 0
  while queue not empty:
    define curr as queue[0]
    if curr.left exists:
      enqueue left
      set level[curr.left] = level[curr]+1
    if curr.right exists:
      enqueue right
      set level[curr.right] = level[curr]+1
    dequeue curr
  
  define result = [][]
  for k,v in level:
    push k to result[v] 

Code

class TreeNode {
  constructor(val = 0, left = null, right = null){
    this.val = val
    this.left = left
    this.right = right
  }
}

/**
 * @param {TreeNode} root
 * @return {number[][]}
 */
const levelOrderBottom = (root) => {
  //error checks
  if(root === null){
    return []
  }

  const level = new Map()
  const queue = []
  
  queue.push(root)
  level.set(root, 0)

  while(queue.length > 0){
    let currNode = queue[0]
    if(currNode.left){
      queue.push(currNode.left)
      level.set(currNode.left, level.get(currNode) + 1)
    }
    if(currNode.right){
      queue.push(currNode.right)
      level.set(currNode.right, level.get(currNode) + 1)
    }
    queue.shift()
  }

  const result = []
  for(let [node, level] of level){
    if(Array.isArray(result[level])){
      result[level].push(node.val)
    } else {
      result[level] = [node.val]
    }
  }

  return result.reverse()
};

Time comeplexity: O(n)
Space complexity: O(n)

PseudoCode 2

levelOrderBottom(root):
  define result = []
  define queue = []
  push root to queue
  while queue is not empty:
    define level = []
    for i = 0 to size of queue, i++:
      define node = queue.pop()
      if node.left:
        q.push node.left
      if node.right:
        q.push node.right
      level.push node.val
    result.unshift level
  return result

Code 2

const levelOrderBottom = (root) => {]
  //error check
  if(!root){
    return []
  }

  const result = []
  const queue = []
  queue.push(root)
  while (queue.length) {
    let level = []
    for(let i = 0; i < queue.length; i++) {
      let node = queue.shift()
      if (node.left){
        queue.push(node.left)
      }
      if (node.right){
        queue.push(node.right)
      }
      level.push(node.val)
    }
    result.unshift(level)
  }
  return result
}

Time comeplexity: O(n)
Space complexity: O(n)