赞
踩
演示图
tree:
const tree = { val: 1, left: { val: 2, left: null, right: { val: 4, left: null, right: { val: 7, left: null, right: { val: 8, left: null, right: null } } } }, right: { val: 3, left: { val: 5, left: null, right: null }, right: { val: 6, left: null, right: null } } }
从左到右,每次都遍历到叶子节点。
使用递归的方法,先递归左部分,然后递归右边部分。
function dfs(node) {
if (!node) {
return;
}
console.log(node.val); //处理操作
dfs(node.left);
dfs(node.right);
}
dfs(tree);
从上到下,每次都要把每层遍历完。
引入队列,来保存每层的节点,用于遍历。
//运用队列 var bfs = function (root) { //二叉树的层次遍历 let res = []; let quene = [root]; if (root === null) { return res; } while (quene.length !== 0) { let currentLevel = []; let len = quene.length; for (let i = 0; i < len; i++) { let node = quene.shift(); currentLevel.push(node.val); console.log(node.val); if (node.left) quene.push(node.left); if (node.right) quene.push(node.right); } res.push(currentLevel); } return res; }; let res = bfs(tree); console.log(res);
运用了队列先进先出的原则,首先将队列初始化为只包含根节点:
let quene = [root]
因为后面还会给队列添加节点,所以使用while循环来保证一直循环到所有节点遍历完。
使用一个for循环遍历当前层的所有节点:
for (let i = 0; i < len; i++) {
let node = quene.shift();//取出队列第一个元素
currentLevel.push(node.val);
console.log(node.val);
if (node.left) quene.push(node.left);
if (node.right) quene.push(node.right);
}
在访问当前层节点的同时,将当前层每个节点的子节点入队列,用于下一次while循环访问。
例如第一次while循环后,也就是" 1 "被访问后,队列应该是:
[{ val: 2, left: null, right: { val: 4, left: null, right: { val: 7, left: null, right: { val: 8, left: null, right: null } } } }, { val: 3, left: { val: 5, left: null, right: null }, right: { val: 6, left: null, right: null } } ]
下一次出队列的便是" 2 "节点。
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。