什么是深度优先遍历
深度优先遍历就是当我们搜索一个树的分支时,遇到一个节点,我们会优先遍历它的子节点,直到最后根节点位置,最后再遍历兄弟节点,从兄弟节点寻找它的子节点,知道搜索到最后结果,然后结束。
const root = {name: '1',children: [{name: '2-1',children: [{name: '3-1',children: [{name: '4-2',children: null},{name: '4-1',children: null}]},{name: '3-2',children: null}]},{name: '2-2',children: null}]}// 深度优先遍历const deepDFS = (root, nodeList = []) => {if(root) {nodeList.push(root.name);root.children && root.children.forEach(v => deepDFS(v, nodeList));}return nodeList;}const result = deepDFS(root, []);/**["1","2-1","3-1","4-2","4-1","3-2","2-2"]**/
什么是广度优先遍历
搜索树分支时,从根节点开始,当访问子节点时,先遍历找到兄弟节点,再寻找对应自己的子节点。
const deepBFS = (root, nodeList = []) => {
const queue = [root];
while(queue.length > 0) {
const p = queue.shift();
nodeList.push(p.name);
p.children && p.children.forEach(v => queue.push(v));
}
return nodeList;
}
/*
[
"1",
"2-1",
"2-2",
"3-1",
"3-2",
"4-2",
"4-1"
]
*/
广度优先遍历的主要思想是将一个树放到一个队列中,我们循环这个队列,判断该队列的长度是否大于0,不断循环队列,shift出队列操作,然后判断节点children,循环children,然后将子节点添加到队列中,一旦队列长度为0,那么就终止循环了。
总结
- 理解深度优先遍历与广度优先遍历是什么
- 用具体代码实现深度优先遍历与广度优先遍历
- 深度优先更耗时 ```javascript const deepDFS = (root, nodeList = []) => { if(root) { nodeList.push(root.name); root.children && root.children.forEach(v => deepDFS(v, nodeList)); } return list; }
const deepBFS = (root, nodeList = []) => { let queue = [root]; while(queue.length > 0) { const curr = queue.shift(); nodeList.push(curr.name); curr.children && curr.children.forEach(v => queue.push(v)); } return nodeList; } ```
