js實現深度優先遍歷和廣度優先遍歷


深度優先遍歷和廣度優先遍歷

什麼是深度優先和廣度優先

其實簡單來講 深度優先就是自上而下的遍歷搜索 廣度優先則是逐層遍歷, 以下圖所示算法

1.深度優先
bash

image.png

2.廣度優先
post

image.png

二者的區別

對於算法來講 無非就是時間換空間 空間換時間ui

  1. 深度優先不須要記住全部的節點, 因此佔用空間小, 而廣度優先須要先記錄全部的節點佔用空間大
  2. 深度優先有回溯的操做(沒有路走了須要回頭),因此相對而言時間會長一點


具體代碼

const data = [
    {
        name: 'a',
        children: [
            { name: 'b', children: [{ name: 'e' }] },
            { name: 'c', children: [{ name: 'f' }] },
            { name: 'd', children: [{ name: 'g' }] },
        ],
    },
    {
        name: 'a2',
        children: [
            { name: 'b2', children: [{ name: 'e2' }] },
            { name: 'c2', children: [{ name: 'f2' }] },
            { name: 'd2', children: [{ name: 'g2' }] },
        ],
    }
]

// 深度遍歷, 使用遞歸
function getName(data) {
    const result = [];
    data.forEach(item => {
        const map = data => {
            result.push(data.name);
            data.children && data.children.forEach(child => map(child));
        }
        map(item);
    })
    return result.join(',');
}

// 廣度遍歷, 建立一個執行隊列, 當隊列爲空的時候則結束
function getName2(data) {
    let result = [];
    let queue = data;
    while (queue.length > 0) {
        [...queue].forEach(child => {
            queue.shift();
            result.push(child.name);
            child.children && (queue.push(...child.children));
        });
    }
    return result.join(',');
}

console.log(getName(data))
console.log(getName2(data))複製代碼

本文來源於:juejin.im/post/5c4a96…
spa

總結:

深度優先遍歷和廣度優先遍歷的區別:

  • 深度優先採用的是堆棧的形式, 即先進後出
  • 廣度優先則採用的是隊列的形式, 即先進先出(相似於平常中的排隊)
  • 對於算法來講 無非就是時間換空間 空間換時間
  • 深度優先就是自上而下的遍歷搜索 廣度優先則是逐層遍歷
  • 深度優先佔用空間小,時間慢(由於回溯)。(時間換空間)
  • 廣度優先佔用空間大,時間快。(空間換時間)
相關文章
相關標籤/搜索