广度优先遍历,先遍历全部邻接点,再往下遍历,按照dom树转为而二叉树有序遍历以下:
// 广度优先有序遍历:先访问全部邻节点
function Bfs(node, isChild){
var firstChild = isChild ? node.firstElementChild : node.nextElementSibling;
if (firstChild) {
console.log(firstChild)
if (firstChild.nextElementSibling) {
Bfs(firstChild, 0)
} else {
Bfs(firstChild.parentNode.firstElementChild, 1)
}
} else {
if (node.parentNode.nextElementSibling) {
Bfs(node.parentNode.nextElementSibling, 1)
} else {
console.log('遍历结束' )
}
}
}
Bfs(document.getElementById('root' ), 1)
复制代码
// 广度优先遍历:非递归遍历,按照队列的先进先出
function Bfs(node){
let nodes = []
let stack = []
if (node) {
stack.push(node)
while (stack.length) {
let item = stack.shift()
let children = item.children
nodes.push(item)
for (let i =0;i<children.length;i++) {
stack.push(children[i])
}
}
}
return nodes
}
let nodes = Bfs(document.getElementById('root' ).firstElementChild)
console.log(nodes)
复制代码
深度优先遍历:分为三种,先序(根-左-右),中序(左-根-右),后序(左-右-根)
//深度有序优先遍历:先序遍历根-左-右
function LeftDfs(node,isChild){
var firstChild = isChild ? node.firstElementChild : node.nextElementSibling;
if (firstChild) {
console.log(firstChild)
if (firstChild.firstElementChild) { // 先判断子节点
LeftDfs(firstChild,1)
} else if (firstChild.nextElementSibling){ // 在判断子节点的邻节点
LeftDfs(firstChild,0)
} else {
LeftDfs(firstChild.parentNode, 0)
}
} else {
console.log('遍历结束' )
}
}
LeftDfs(document.getElementById('root' ),1)
复制代码
//非递归遍历,按照栈
let LeftDfs= (node) => {
let stack = []
let nodes = []
if (node) {
// 推入当前处理的node
stack.push(node)
while (stack.length) {
let item = stack.pop()//出栈
let children = item.children
nodes.push(item)
for (let i = children.length - 1; i >= 0; i--) {
stack.push(children[i])
}
}
}
return nodes
}
//深度优先遍历:递归遍历
function LeftDfs(node, nodeTree){
if (node !== null) {
nodeTree.push(node)
for (let i =0; i<node.children.length;i++) {
LeftDfs(node.children[i],nodeTree)
}
}
return nodeTree
}
let node = LeftDfs(document.getElementById('root' ).firstElementChild, [])
console.log(node)
复制代码