N叉树的深度优先遍历、广度优先遍历、层序遍历

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, "铜川"))
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

青菜小王子

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值