創建二叉樹結構
function TreeNode(val) {
this.val = val;
this.left = this.right = null;
}
let root = new TreeNode(1)
let node2 = new TreeNode(2)
let node3 = new TreeNode(3)
let node4 = new TreeNode(4)
let node5 = new TreeNode(5)
let node6 = new TreeNode(6)
let node7 = new TreeNode(7)
root.left = node2
root.right = node3
node2.left = node4
node2.right = node5
node3.left = node6
node3.right = node7
// 二叉樹結構:
// 1
// / \
// / \
// 2 3
// / \ / \
// 4 5 6 7
廣度優先遍歷
思路
使用隊列實現,未訪問的元素入隊,訪問後則出隊,並將其左右子元素入隊,直到葉子元素結束.
分層訪問,即通過隊列長度控制每層遍歷訪問的節點數.如第一層訪問一個節點後,queue此時爲第二層的節點,queue.length爲2,第二層訪問兩個節點後,queue此時爲第三層的節點…
代碼實現
var levelOrder = function(root) {
if(root == null) {
return []
}
let result = []
let queue = [root]
while(queue.length) {
// 每一層的節點數
let level = queue.length
let currLevel = []
// 每次遍歷一層元素
for(let i = 0;i < level;i++) {
// 當前訪問的節點出隊
let curr = queue.shift()
// 出隊節點的子女入隊
curr.left ? queue.push(curr.left) : ''
curr.right ? queue.push(curr.right) : ''
currLevel.push(curr.val)
}
result.push(currLevel)
}
return result
};
隊列狀態變化
// 二叉樹結構:
// 1
// / \
// / \
// 2 3
// / \ / \
// 4 5 6 7
第1層的1個元素出隊:
[ TreeNode {
val: 2,
right: TreeNode { val: 5, right: null, left: null },
left: TreeNode { val: 4, right: null, left: null } },
TreeNode {
val: 3,
right: TreeNode { val: 7, right: null, left: null },
left: TreeNode { val: 6, right: null, left: null } } ]
第2層的2個元素出隊:
[ TreeNode {
val: 3,
right: TreeNode { val: 7, right: null, left: null },
left: TreeNode { val: 6, right: null, left: null } },
TreeNode { val: 4, right: null, left: null },
TreeNode { val: 5, right: null, left: null } ]
[ TreeNode { val: 4, right: null, left: null },
TreeNode { val: 5, right: null, left: null },
TreeNode { val: 6, right: null, left: null },
TreeNode { val: 7, right: null, left: null } ]
第3層的4個元素出隊:
[ TreeNode { val: 5, right: null, left: null },
TreeNode { val: 6, right: null, left: null },
TreeNode { val: 7, right: null, left: null } ]
[ TreeNode { val: 6, right: null, left: null },
TreeNode { val: 7, right: null, left: null } ]
[ TreeNode { val: 7, right: null, left: null } ]
[]
結果
console.log(levelOrder(root))
// [ [ 1 ], [ 2, 3 ], [ 4, 5, 6, 7 ] ]