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


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

其實簡單來說 深度優先就是自上而下的遍歷搜索 廣度優先則是逐層遍歷

兩者的區別

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

深度優先不需要記住所有的節點, 所以占用空間小, 而廣度優先需要先記錄所有的節點占用空間大
深度優先有回溯的操作(沒有路走了需要回頭)所以相對而言時間會長一點
深度優先采用的是堆棧的形式, 即先進后出
廣度優先則采用的是隊列的形式, 即先進先出

代碼

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 DFS(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 BFS(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(DFS(data))		//root,a,b,e,c,f,d,g,a2,b2,e2,c2,f2,d2,g2
console.log(BFS(data))		//root,a,a2,b,c,d,b2,c2,d2,e,f,g,e2,f2,g2


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM