JavaScript實現二叉樹廣度優先遍歷

創建二叉樹結構

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 ] ]
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章