深度優先與廣度優先的定義
首先我們先要知道什么是深度優先什么是廣度優先。
深度優先遍歷是指從某個頂點出發,首先訪問這個頂點,然后找出剛訪問這個結點的第一個未被訪問的鄰結點,然后再以此鄰結點為頂點,繼續找它的下一個頂點進行訪問。重復此步驟,直至所有結點都被訪問完為止。
廣度優先遍歷是從某個頂點出發,首先訪問這個頂點,然后找出剛訪問這個結點所有未被訪問的鄰結點,訪問完后再訪問這些結點中第一個鄰結點的所有結點,重復此方法,直到所有結點都被訪問完為止。
代碼實現
以下代碼針對樹的遍歷實現,可能根據實際情況有所不同。
有疑問的話可以咨詢我。
//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; }
深度優先遍歷從某個頂點出發,首先訪問這個頂點,然后找出剛訪問這個結點的第一個未被訪問的鄰結點,然后再以此鄰結點為頂點,繼續找它的下一個新的頂點進行訪問,重復此步驟,直到所有結點都被訪問完為止。
廣度優先遍歷從某個頂點出發,首先訪問這個頂點,然后找出這個結點的所有未被訪問的鄰接點,訪問完后再訪問這些結點中第一個鄰接點的所有結點,重復此方法,直到所有結點都被訪問完為止。
