hi,chatGPT,帮我写一个深度优先遍历和广度优先遍历

96 阅读1分钟

最近chatGPT热度不减,今天抽空体验了一下(国内镜像版本),看看chatGPT写的算法怎么样。

嗯...答案很快出来了,结果见下图

1676536545(1).png

深度优先遍历

深度优先其实就是先遍历子节点,然后再遍历兄弟节点,可以利用递归实现。

假设数据结构如下:

var nodes = {
    value: 'A',
    children: [
        {
            value: 'B',
            children: [
                {
                    value: 'C',
                },
                {
                    value: 'D'
                }
            ]
        }, {
            value: 'E'
        }
    ],
}

以上对象形如一个二叉树

1.png

深度优先遍历的顺序就是:A-B-C-D-E

function depthFirstSearch(node) {
  if (node == null) {
    return;
  }
  console.log(node.value);
  let children = node.children || [];
  // 如果node节点存在childre,那么继续往下遍历
  children.forEach((child) => {
    depthFirstSearch(child);
  });
}

depthFirstSearch(nodes);
// log: A B C D E

广度优先遍历

广度优先遍历的顺序是:A-B-E-C-D

先遍历兄弟节点,再遍历子节点。可以利用数组队列将当前节点的children展开后,添加到数组最后,等到兄弟节点遍历完成,再遍历子节点

function breadthFirstSearch(nodes) {
  if (!nodes) return;
  let queue = [nodes];
  while (queue.length) {
    let item = queue.shift();
    console.log(item.value);
    let children = item.children || [];
    for (const child of children) {
      queue.push(child);
    }
  }
}
breadthFirstSearch(nodes);
// log: A B E C D

如果把queue队列里打印出来,依次是:

[ { value: 'A', children: [ [Object], [Object] ] } ]
[ { value: 'B', children: [ [Object], [Object] ] }, { value: 'E' } ]
[ { value: 'E' }, { value: 'C' }, { value: 'D' } ]
[ { value: 'C' }, { value: 'D' } ]
[ { value: 'D' } ]