JavaScript實現樹深度優先和廣度優先遍歷搜索


1、前置條件

我們提前構建一棵樹,類型為 Tree ,其節點類型為 Note。這里我們不進行過多的實現,簡單描述下 Note 的結構:

class Node{
    constructor(data){
        this.data = data;
        this.children = []; // 存放所以子節點,如果是二叉樹,可以分為兩個屬性,left和right分別存儲左右子節點
    }
}

class Tree{
    constructor(){
        this.root = new Node('root'); // 樹結構,標識出自己的根節點
    }
}

2、廣度優先遍歷

廣度優先遍歷,就是按層來遍歷樹結構,例如:

    1
  2   3
4  5    6
// 遍歷出來的結果:123456

實現思路

    1. 首先創建一個隊列,然后將樹的根節點,放入隊列,作為隊列第一個元素
    1. 然后開始遍歷隊列,如果遍歷的元素,有子節點,則將所有子節點,追加進隊列末尾
    1. 最后的隊列就是廣度優先遍歷的結果
      使用JavaScript來實現:
function bsf(tree){
        let quen = []; // 用來遍歷的數組
        // let result = []; // 遍歷的結果
        quen.push(tree.root);
        // 從隊列取,然后再追加
        for(let i = 0;i<=quen.length-1;i++){
            let k = quen[i];
            if(k.children.length){
                quen = quen.concat(k.children);
            }
        }
        return quen;
    }

3、深度優先搜索

先遍歷完一個末尾節點,再遍歷第二個末尾節點,例如:

    1
  2   3
4  5    6
// 遍歷出來的結果:124536

深度優先,最簡單的方法就是遞歸遍歷,但是不適合實際中使用:

使用棧來實現深度優先遍歷

    1. 節點需要增加一些屬性,來標識我們的計算狀態,isDone是否已經檢測過,isOver是否還有子節點未檢測
    1. 建立一個棧,把樹的根節點放進去。在准備一個數組,用來顯示我們檢測的路徑
    1. 取出棧中最上面的節點,檢測(檢測完放進路徑數組),然后將某個未檢測的子節點,放入棧
    1. 重復3步驟,如果該節點,沒有未檢測的子節點,且自身已檢測完畢,則將其上級節點,再次添加到 棧 中
    1. 重復3步驟


免責聲明!

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



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