BFS和DFS遍历二叉树完整实现
请用JavaScript实现二叉树的广度优先(BFS/层序遍历)和深度优先(DFS前中后序)遍历,并对比两者使用场景。
回答
古法程序员
class TreeNode {
constructor(val) { this.val = val; this.left = this.right = null; }
}
function bfs(root) {
if (!root) return [];
const result = [];
const queue = [root];
while (queue.length) {
const levelSize = queue.length;
const level = [];
for (let i = 0; i < levelSize; i++) {
const node = queue.shift();
level.push(node.val);
if (node.left) queue.push(node.left);
if (node.right) queue.push(node.right);
}
result.push(level);
}
return result;
}
function dfsInOrder(node, res = []) {
if (!node) return res;
dfsInOrder(node.left, res);
res.push(node.val);
dfsInOrder(node.right, res);
return res;
}
function dfsPreOrder(root) {
if (!root) return [];
const stack = [root], res = [];
while (stack.length) {
const node = stack.pop();
res.push(node.val);
if (node.right) stack.push(node.right);
if (node.left) stack.push(node.left);
}
return res;
}
对比:BFS找最短路径(如迷宫)、层级相关需求;DFS内存占用低(栈深可控时)、判断存在性、拓扑排序、路径枚举。二叉树序列化/反序列化也依赖遍历。