深度优先遍历 使用递归
function deepTraversal1(node) {
const n = [];
if (node != null) {
n.push(node);
for (let i = 0; i < node.child.length; i++) {
n.concat(node.child[i]);
}
}
return n;
}
广度优先遍历
function deepTraversal2(node) {
// 用来记录访问的节点
const n = [];
// 用来做遍历的队列
const s = [];
if (node) {
s.push(node)
// 里面运行一圈表示 进行了节点遍历
while (s.length) {
const curN = s.shift();
n.push(curN);
if (curN.child) {
for (let i = 0; i < curN.child.length; i++) {
s.push(curN.child[i]);
}
}
}
}
return n;
}
深度优先遍历 不使用递归
function deepTraversal3(node) {
const n = [];
// 做栈道 先入后出
const s = [];
if (node) {
s.push(node);
while (s.length) {
const curN = s.pop()
n.push(curN);
// 推出栈 由节点 最后面进行入栈 遍历
for (let i = curN.child.length - 1; i >= 0; i--) {
s.push(curN.child[i])
}
}
}
return n;
}
注意
深度优先遍历 不使用递归的方式 和广度优先遍历 实现有 很大的相似度
深度优先遍历 不使用递归的方式 利用的 数组模拟栈的模式 ,同时子节点 进行 后面的节点先入栈的方式 ,让最右边的节点 最深 进行遍历
广度优先遍历 利用的是 数组模拟队列的方式 ,依次添加节点进去 然后遍历。