const tree = {
code: "china",
name: "中国",
children: [{
code: '2973',
name: '陕西',
children: [{
code: '2974',
name: '西安',
children: [
{ code: '2975', name: '西安市' },
{ code: '2976', name: '高陵县' }
]
}, {
code: '2980',
name: '铜川',
children: [
{ code: '2981', name: '铜川市' },
{ code: '2982', name: '宜君县' }
]
}, {
code: '2983',
name: '宝鸡'
}]
}, {
code: '3371',
name: '新疆',
children: [{
code: '3430',
name: '巴音郭楞蒙古自治州',
children: [
{ code: '3431', name: '库尔勒市' },
{ code: '3432', name: '和静县' }
]
}]
}, {
code: '3078',
name: '四川'
}]
};
深度优先遍历
function DFS(root, arr = []) {
if (!root) return;
arr.push(root.name);
if (root.children) {
root.children.forEach(element => {
DFS(element, arr);
});
}
return arr;
}
console.log(DFS(tree));
/* ['中国', '陕西', '西安', '西安市', '高陵县', '铜川', '铜川市', '宜君县',
'宝鸡', '新疆', '巴音郭楞蒙古自治州', '库尔勒市', '和静县', '四川'] */
广度优先遍历
/**
* 广度优先遍历,返回一维数组
* @param {*} root
*/
var BFS = function (root) {
let queue = []; //
let result = [];
queue.push(root);
while (queue.length > 0) {
let node = queue.shift();
result.push(node.name);
if (node.children) {
node.children.forEach(element => {
queue.push(element);
});
}
}
return result;
};
console.log(BFS(tree));
/*['中国', '陕西', '新疆', '四川', '西安', '铜川', '宝鸡', '巴音郭楞蒙古自治州',
'西安市', '高陵县', '铜川市', '宜君县', '库尔勒市', '和静县' ]
*/
层序遍历
前往层序遍历概念
var levelOrder = function (root) {
let queue = []; //
let result = [];
queue.push(root);
while (queue.length > 0) {
let size = queue.length; // 当前层级的个数
let levelArr = [];
for (let i = 0; i < size; i++) { // 嵌套一层循环,处理每个层级的数据
const node = queue.shift();
levelArr.push(node.name);
if (node.children) {
node.children.forEach(element => {
queue.push(element);
});
}
}
result.push(levelArr);
}
return result;
};
console.log(levelOrder(tree));
/*
[
[ '中国' ],
[ '陕西', '新疆', '四川' ],
[ '西安', '铜川', '宝鸡', '巴音郭楞蒙古自治州' ],
[ '西安市', '高陵县', '铜川市', '宜君县', '库尔勒市', '和静县' ]
]
*/
树中查找某个结点
/**
* 树结构查找某个结点算法
* @param {*} root
* @param {*} data
*/
function findNode(root, data) {
if (!root) return null;
if (root.name === data) {
return root;
}
if (!root.children) {
return null;
}
for (let item of root.children) {
let node = findNode(item, data);
if (node) return node; //如果查找到某个结点,则退出循环
}
}
console.log(findNode(tree, "铜川"))