赞
踩
深度优先遍历: 深度优先遍历就是找准一条路不停深入的搜索方法,当发现这条路走不通的时候就会回退到上一个探索的节点,如果上一个节点存在没有探索的分支,便继续探索若没有则继续回退。
广度优先遍历: 广度优先遍历(BFS),又叫宽度优先搜索或横向优先搜索,是从根结点开始沿着树的宽度搜索遍历,将离根节点最近的节点先遍历出来,在继续深挖下去。
// 定义一个访问函数,输出访问到的节点 function visitNode(node) { // 注释 if (node instanceof Comment) { console.log("注释节点->", node.textContent); } // 文本 if (node instanceof Text) { // 由于有的元素中没有文本节点也包含空串,并且空格也算上,因此这里做一下处理 if (node.textContent.trim()) { console.log("文本节点->", node.textContent.trim()); } } // 元素节点 if (node instanceof HTMLElement) { console.log("HTML元素节点->", `<${node.tagName.toLowerCase()}>`); } }
// 定义深度优先遍历DOM树的方法 - 递归实现
function dfs(root) {
visitNode(root)
// 获取所有的子节点
// root.childNode获取所有子节点(包括注释节点,文本节点,HTML元素节点)
// root.children获取所有HTML元素节点
let childNodes = root.childNodes
// 对每一个子节点都进行深度优先遍历
if (childNodes.length) {
childNodes.forEach((item) => {
dfs(item)
})
}
}
// 定义深度优先遍历DOM树的方法 - 非递归实现(采用栈结构实现,递归本身就是栈结构实现的) function dfs1(root) { // 首先准备一个栈 const stack = [] // 根元素首先压栈 stack.push(root) // 如果栈结构不为空,那就进入到while循环中 while (stack.length) { // 首先弹栈,取出当前元素 let curNode = stack.pop() // 判断弹出的元素为空吗,如果为空,那就终止一切吧 if (curNode == null) break; visitNode(curNode) // 不为空,那就获取当前节点的所有子节点 let childNodes = curNode.childNodes; // 遍历所有的子节点,压栈 if (childNodes.length) { Array.from(childNodes).reverse().forEach((item) => { stack.push(item) }) } } }
//实现广度优先遍历 function bfs(root) { // 准备一个队列(用数组模仿) const queue = [] // 让根元素进队列吧 queue.push(root) // 当队列不为空时 while (queue.length) { // 取出队列头 let curNode = queue.shift() // 判断取出的节点是否为空,若为空,跳出循环 if (curNode == null) break; // 访问此节点 visitNode(curNode) // 遍历当前结点的所有孩子节点,把所有的孩子节点都入队 let childNodes = curNode.childNodes if (childNodes.length) { childNodes.forEach((item) => { queue.push(item) }) } } }
这是html结构:
<div class="box">
<!-- 这是box内部 -->
<div>
<ul>
<!-- 这是ul内部 -->
<li>1-1</li>
<li>1-2</li>
<li>1-3</li>
</ul>
</div>
<div>2</div>
<div>3</div>
</div>
这是js代码:
dfs(document.querySelector(".box"))
这是输出结果:
这是html结构:
<div class="box">
<!-- 这是box内部 -->
<div>
<ul>
<!-- 这是ul内部 -->
<li>1-1</li>
<li>1-2</li>
<li>1-3</li>
</ul>
</div>
<div>2</div>
<div>3</div>
</div>
这是js代码:
bfs(document.querySelector(".box"))
这是输出结果:
Have a nice day!
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。