js實現對樹深度優先遍歷與廣度優先遍歷


深度優先與廣度優先的定義

首先我們先要知道什么是深度優先什么是廣度優先。

深度優先遍歷是指從某個頂點出發,首先訪問這個頂點,然后找出剛訪問這個結點的第一個未被訪問的鄰結點,然后再以此鄰結點為頂點,繼續找它的下一個頂點進行訪問。重復此步驟,直至所有結點都被訪問完為止。

廣度優先遍歷是從某個頂點出發,首先訪問這個頂點,然后找出剛訪問這個結點所有未被訪問的鄰結點,訪問完后再訪問這些結點中第一個鄰結點的所有結點,重復此方法,直到所有結點都被訪問完為止。

代碼實現

以下代碼針對樹的遍歷實現,可能根據實際情況有所不同。

有疑問的話可以咨詢我。

//1.深度優先遍歷的遞歸寫法
function deepTraversal(node){
    let nodes=[];
    if(node!=null){
        nodes.push[node];
        let childrens=node.children;
        for(let i=0;i<childrens.length;i++)
            deepTraversal(childrens[i]);
    }
    return nodes;
}

//2.深度優先遍歷的非遞歸寫法
function deepTraversal(node){
    let nodes=[];
    if(node!=null){
        let stack=[];//同來存放將來要訪問的節點
        stack.push(node);
        while(stack.length!=0){
            let item=stack.pop();//正在訪問的節點
            nodes.push(item);
            let childrens=item.children;
            for(let i=childrens.length-1;i>=0;i--)//將現在訪問點的節點的子節點存入stack,供將來訪問
                stack.push(childrens[i]);
        }
    }
    return nodes;
}

//3.廣度優先遍歷的遞歸寫法
function wideTraversal(node){
    let nodes=[],i=0;
    if(node!=null){
        nodes.push(node);
        wideTraversal(node.nextElementSibling);
        node=nodes[i++];
        wideTraversal(node.firstElementChild);
    }
    return nodes;
}

//4.廣度優先遍歷的非遞歸寫法
function wideTraversal(node){
    let nodes=[],i=0;
    while(node!=null){
        nodes.push(node);
        node=nodes[i++];
        let childrens=node.children;
        for(let i=0;i<childrens.length;i++){
            nodes.push(childrens[i]);
        }
    }
    return nodes;
}

 

深度優先遍歷從某個頂點出發,首先訪問這個頂點,然后找出剛訪問這個結點的第一個未被訪問的鄰結點,然后再以此鄰結點為頂點,繼續找它的下一個新的頂點進行訪問,重復此步驟,直到所有結點都被訪問完為止。
廣度優先遍歷從某個頂點出發,首先訪問這個頂點,然后找出這個結點的所有未被訪問的鄰接點,訪問完后再訪問這些結點中第一個鄰接點的所有結點,重復此方法,直到所有結點都被訪問完為止。


免責聲明!

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



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