function TreeNode(x) {
  this.val = x;
  this.left = null;
  this.right = null;
}

// 递归解法,相当于树的后序遍历,回溯到根节点时,比较左右子树的深度取最小+1就是整棵树的最小深度
function run(root) {
  if (undefined === root || null === root) {
    return 0
  }

  let leftChildDeep = run(root.left)
  let rightChildDeep = run(root.right)

  return (leftChildDeep < rightChildDeep) ? (leftChildDeep + 1) : rightChildDeep + 1
}

// 层次遍历解法,由于是从第一层开始遍历,遇到叶子直接返回叶子所在层次就是最小深度
function run(root) {
  if (undefined === root || null === root) {
    return 0
  }

  let queue = []

  root.level = 1
  queue.push(root)

  while (queue.length) {
    let node = queue.shift()

    // 放入左右孩子
    if (node.left) {
      node.left.level = node.level + 1
      queue.push(node.left)
    }
    if (node.right) {
      node.right.level = node.level + 1
      queue.push(node.right)
    }

    if ((!node.left) && (!node.right)) {
      return node.level
    }
  }

  return 0
}

let root = new TreeNode(1)
root.left = new TreeNode(2)
root.right = new TreeNode(3)
root.left.left = new TreeNode(4)
root.left.right = new TreeNode(5)

console.log(
  run(root)
)