## 深度遍历优先与广度遍历优先的区别
* 深度遍历优先,先找子孙后代,再找兄弟, 有回溯(入栈弹栈)操作,所以速度慢些
* 广度遍历优先,先找兄弟,再找子孙,无回溯速度快,但是多了队列的存储,占用内存会大些
<br>
## 深度遍历优先
```
var tree = [{
name: '文件夹0',
expand: false,
children: [{
name: '文件夹2',
expand: false,
children: [{
name: '文件夹4',
expand: false,
}, {
name: '文件夹5',
expand: false,
children: [{
name: '文件夹6',
expand: false,
children: [{
name: '文件夹7',
expand: false,
children: [{
name: '文件夹8',
expand: false,
children: [{
name: '文件夹9',
expand: false,
children: [{
name: '文件夹10',
expand: false,
children: [{
name: '文件夹11',
expand: false,
children: [{
name: '文件夹12',
expand: false,
children: [{
name: '文件夹13',
expand: false,
children: [{
name: '文件夹14',
expand: false,
children: [{
name: '文件夹15',
expand: false
}]
}]
}]
}]
}]
}]
}]
}]
}]
}]
}]
},
{
name: '文件夹3',
expand: false
}
]
},
{
name: '文件夹1',
expand: false
}
]
// 深度遍历优先
function expandAll(tree) {
tree.forEach(node => {
node.expand = true;
if (node.children && Array.isArray(node.children) && node.children.length > 0) {
expandAll(node.children);
}
});
}
// 开始计算t1时间
console.time('t1');
for (let i = 0; i < 10000; i++) {
expandAll(tree);
}
// t1时间计算结束
console.timeEnd('t1');
console.log(tree);
```
<br>
## 广度优先遍历
```
var tree = [{
name: '文件夹0',
expand: false,
children: [{
name: '文件夹2',
expand: false,
children: [{
name: '文件夹4',
expand: false,
}, {
name: '文件夹5',
expand: false,
children: [{
name: '文件夹6',
expand: false,
children: [{
name: '文件夹7',
expand: false,
children: [{
name: '文件夹8',
expand: false,
children: [{
name: '文件夹9',
expand: false,
children: [{
name: '文件夹10',
expand: false,
children: [{
name: '文件夹11',
expand: false,
children: [{
name: '文件夹12',
expand: false,
children: [{
name: '文件夹13',
expand: false,
children: [{
name: '文件夹14',
expand: false,
children: [{
name: '文件夹15',
expand: false
}]
}]
}]
}]
}]
}]
}]
}]
}]
}]
}]
},
{
name: '文件夹3',
expand: false
}
]
},
{
name: '文件夹1',
expand: false
}
]
// 广度遍历优先
function expandAll(tree) {
let queue = [];
tree.forEach(node => {
queue.push(node);
});
for(;queue.length > 0;){
let node = queue.shift();
node.expand = true;
if(Array.isArray(node.children) && node.children.length > 0){
node.children.forEach(child => {
queue.push(child);
});
}
}
}
console.time('t2');
for (let i = 0; i < 10000; i++) {
expandAll(tree);
}
console.timeEnd('t2');
console.log(tree);
```
- 初级前端题
- 必会
- http协议
- 跨域
- cookie与storage
- 移动端问题
- 性能优化
- Vue全家桶
- 有哪些常用的es6语法?
- 项目
- 闭包
- JSON
- 数据类型与运算
- 数组
- DOM
- 字符串
- 要会
- async与await
- 正则
- this
- 数据加密
- 实时获取数据
- 原生ajax
- 异步打印
- css相关
- 杂七杂八
- webpack
- 一般
- mvvm模式
- 异步请求
- XSS
- 其他dom问题
- 冷门
- 浏览器缓存机制
- 新
- 浏览器事件轮询
- Promise
- 树的深度优先与广度优先
- 拷贝
- 继承
- Vue
- 跨域
- 排序
- 浏览器
- 浏览器入门
- 浏览器内核知识
- 浏览器渲染原理
- 浏览器性能调优
- 自动化构建
- 字符编码
- git
- 一些题目
- 其他
- 逻辑思维题
- 互联网公司招聘信息如何阅读
- bat面试