1、树:可指多叉树或者二叉树
2、树结构对应 数据放在文章底部, 文章里的所有实现都是根据这些数据结构实现的,实际操作中可适当调整
3、会逐步实现 树的其他操作,优化完善实现方法
遍历
树、类树结构的数据的遍历一般分为两种,深度优先遍历和广度优先遍历
深度优先遍历又分为了:前序遍历、中序遍历和后序遍历
广度优先遍历 :层序遍历
1、前序遍历
思路
- 循环
- 有children的需要将children作为输入 递归调用
实现
function fooeach(data){
for(var i=0;i<data.length;i++){
console.log(data[i].path);
if(data[i].children && data[i].children.length>0){
fooeach(data[i].children)
}
}
}
fooeach(tree);// 遍历输出树的子节点
2、树的深度
思路
- 遍历树,在遍历的时候同时统计当前的深度
- deep:遍历到当前节点时树的深度
- resdeep:树的最终深度
- 当没有子节点时,说明当前的分支遍历到了尽头, deep 和 resdeep进行比较,如果deep大于resdeep ,将deep的值赋给resdeep 。
- 每次遍历到当前分支的尽头时,将deep重置为0。
- 传入的children不能为空,否则deep出现不及时重置的情况,导致结果有误
实现
function getTreeDeep(data){
var deep=0;// 统计 遍历到当前节点时的深度
var resdeep=0; // 保存,树的最终深度
function fooeach(data){
for(var i=0;i<data.length;i++){
// 有路径时,深度加1
if(data[i].path){
deep++;
}
// 有children 并且children不为空时,调用自身
if(data[i].children && data[i].children.length>0){
fooeach(data[i].children);
}else{
// 没有children了,该分支已到了尽头,进行比较、赋值、重置
if(deep>resdeep){
resdeep=deep;
}
deep=0;// 深度重置
}
}
}
fooeach(data)
console.log(resdeep, '---- 树的深度是')
}
getTreeDeep(bianlitree(treeList);
)
3、查找节点
思路
- 遍历
- 逐一将每个节点和要查找的节点逐一对比
- 有则有,无则无
实现
function findNode(data,node){
var flag=false;
function fn(data){
for(var i=0;i<data.length;i++){
if(data[i].path==node){
// 找到后立即退出
flag=true;
return
}else{
if(data[i].children && data[i].children.length>0){
fn(data[i].children);