给定二叉树 [3,9,20,null,null,15,7],
3
/ \
9 20
/ \
15 7
返回其自底向上的层次遍历为:
[
[15,7],
[9,20],
[3]
]
给定二叉树 [3,9,20,null,null,15,7],
3
/ \
9 20
/ \
15 7
返回其自底向上的层次遍历为:
[
[15,7],
[9,20],
[3]
]
二叉树的层序遍历要用到迭代法,设置一个队列queue(其实就是数组),把根节点加入队列中,当队列不会空时,出队列元素,然后把这个元素的子结点加入到队列中。
function TreeNode(val) {
this.val = val;
this.left = this.right = null;
}
var Tree = (function() {
var root = null;
var build = function(valueList) {
if (!valueList || valueList.length === 0) {
return
}
root = new TreeNode(valueList.shift())
var queue = [root]
var tempQueue = []
while (queue.length > 0) {
var node = queue.shift();
if (valueList.length === 0) { //构建结束
break;
}
var leftVal = valueList.shift()
if (leftVal !== null) { //构建左子节点
node.left = new TreeNode(leftVal)
tempQueue.push(node.left)
}
if (valueList.length === 0) { //构建结束
break;
}
var rightVal = valueList.shift()
if (rightVal !== null) { //构建又子节点
node.right = new TreeNode(rightVal)
tempQueue.push(node.right)
}
if (queue.length === 0) { //本次构建结束
queue = tempQueue;
}
}
return this;
}
//层次遍历 或者广度优先遍历
var bfsDesc = function() {
if (!root) { return }
var queue = [],
result = []
queue.push(root)
var levelArr = [];
var tempQueue = []
while (queue.length > 0) {
var node = queue.shift()
levelArr.push(node.val)
if (node.left) {
tempQueue.push(node.left)
}
if (node.right) {
tempQueue.push(node.right)
}
if (queue.length === 0) { //说明本层遍历结束
result.push(levelArr.concat())
levelArr = []
queue = tempQueue
tempQueue = []
}
}
return result.reverse();
}
return {
build: build,
bfsDesc: bfsDesc
}
})();
var tree = Tree.build([3, 9, 20, null, null, 15, 7]);
console.log(tree.bfsDesc())