深度优先遍历和广度优先遍历

最近看手写浅拷贝和深拷贝一直刷到用深度优先遍历和广度优先遍历,想起以前大学也学过东西,老是容易忘,特此记录下写法

深度优先遍历

var arrResult: Array<string> = []
var testArr: Array<any> = [{
    name: 'a',
    children: [{
        name: 'a1',
        children: [{
            name: 'a11'
        }, {
            name: 'a12'
        }]
    }, {
        name: 'a2',
        children: [{
            name: 'a21'
        }, {
            name: 'a22'
        }]
    }, {
        name: 'a3',
        children: [{
            name: 'a31'
        }, {
            name: 'a32'
        }]
    },],
}, {
    name: 'b',
    children: [{
        name: 'b1',
        children: [{
            name: 'b11'
        }, {
            name: 'b12'
        }]
    }, {
        name: 'b2',
        children: [{
            name: 'b21'
        }, {
            name: 'b22'
        }]
    }, {
        name: 'b3',
        children: [{
            name: 'b31'
        }, {
            name: 'b32'
        }]
    },],
}];
function dfs(arr: any): void {
	// 深度优先遍历递归放在for里面,遍历每个节点的时候递归下面的节点
    for (var i = 0; i < arr.length; i++) {
        arrResult.push(arr[i].name);
        if (arr[i].children) {
            dfs(arr[i].children)
        }
    }
}
dfs(testArr)
console.log(arrResult)
//  [
//   'a',   'a1',  'a11', 'a12',
//   'a2',  'a21', 'a22', 'a3',
//   'a31', 'a32', 'b',   'b1',
//   'b11', 'b12', 'b2',  'b21',
//   'b22', 'b3',  'b31', 'b32'
// ]

广度优先遍历

var arrResult: Array<string> = []
var testArr: Array<any> = [{
    name: 'a',
    children: [{
        name: 'a1',
        children: [{
            name: 'a11'
        }, {
            name: 'a12'
        }]
    }, {
        name: 'a2',
        children: [{
            name: 'a21'
        }, {
            name: 'a22'
        }]
    }, {
        name: 'a3',
        children: [{
            name: 'a31'
        }, {
            name: 'a32'
        }]
    },],
}, {
    name: 'b',
    children: [{
        name: 'b1',
        children: [{
            name: 'b11'
        }, {
            name: 'b12'
        }]
    }, {
        name: 'b2',
        children: [{
            name: 'b21'
        }, {
            name: 'b22'
        }]
    }, {
        name: 'b3',
        children: [{
            name: 'b31'
        }, {
            name: 'b32'
        }]
    },],
}];
function bfs(arr: Array<any>): void {
    var temp = []
    // 广度优先遍历  递归放外面 遍历完平行节点后再遍历子节点的平行节点
    for (var i of arr) {
        arrResult.push(i.name)
        if(i.children){
        	// 把所有平行节点放到一个数组里面递归
            temp.push(...i.children)
        }
    }
    if(temp.length){
        bfs(temp)
    }
}
bfs(testArr)
console.log(arrResult)
// [
//   'a',   'b',   'a1',  'a2',
//   'a3',  'b1',  'b2',  'b3',
//   'a11', 'a12', 'a21', 'a22',
//   'a31', 'a32', 'b11', 'b12',
//   'b21', 'b22', 'b31', 'b32'
// ]
  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值