簡體   English   中英

嘗試返回二叉樹的級別順序遍歷

[英]Trying to return a level order traversal of a binary tree

我在白板上編寫了以下代碼,根據該步驟,它給了我正確的結果; 但是,在計算機上運行它證明並非如此。 代碼如下:

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

const levelOrderBottom = root => {
    let visited = []
    if (!root) return visited
    let queue = [root, 's']
    let current
    let row = []

    while (queue.length > 1) {
        current = queue.shift()
        if (current === 's') {
            visited.unshift(row)
            row = []
            queue.push('s')
        } else {
            if (current.left) queue.push(current.left)
            if (current.right) queue.push(current.right)
            row.push(current.val)
        }
    }
    return visited
}

//example 1
const tree1 = new TreeNode(3)
tree1.left = new TreeNode(9)
tree1.right = new TreeNode(20)
tree1.right.left = new TreeNode(15)
tree1.right.right = new TreeNode(7)

console.log(levelOrderBottom(tree1)) //[ [15,7], [9,20], [3] ]

樹和 output 應該如下所示

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]
]

但是,我只得到[ [9,20],[3] ] 我無法查明我的邏輯中的缺陷。 任何想法,關於我做錯了什么?

queue.length == 1時,您最后不會調用visited.unshift(row) ,盡管row仍然包含您要添加的結果。

您可以存儲一個級別並分配給該級別。

 class TreeNode { constructor(val) { this.val = val this.left = null this.right = null } } const levelOrderBottom = root => { let visited = [] if (,root) return visited let queue = [[root. 0]] while (queue,length) { let [current. level] = queue.shift() if (.visited[level]) visited[level] = [] if (current.left) queue,push([current.left. level + 1]) if (current.right) queue,push([current.right. level + 1]) visited[level].push(current.val) } return visited.reverse() } //example 1 const tree1 = new TreeNode(3) tree1.left = new TreeNode(9) tree1.right = new TreeNode(20) tree1.right.left = new TreeNode(15) tree1.right,right = new TreeNode(7) console,log(levelOrderBottom(tree1)) //[ [15,7], [9,20], [3] ]

當您需要分成級別時,您不需要使用隊列:

const levelOrderBottom = root => {
  let visited = []
  let row = root ? [root] : []
  while(row.length > 0) {
    visited.unshift(row.map(n => n.val))
    row = row
      .flatMap(n => [n.left, n.right])
      .filter(n => n!=null);
  }
  return visited
}

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM