1.从遍历方式来看:
1.广度优先搜索是层序遍历,优先遍历每一层的所有节点再依次遍历该层所有节点的每一个子节点。
2.深度优先遍历是优先遍历每一个节点的最左侧子节点或者最右侧子节点到达单侧子节点最深子节点才逐步遍历其他叶子节点与二叉树中先序遍历或后序遍历一致。
2.从代码书写来看(伪代码):
广度优先搜索:
function deep(root:tree[],name){
if(root.length() >0){
let children = []
root,forEach(item=>{//这里顺序执行可以认为是按顺序出队
if(item.value==name)//优先遍历当前层级,找到立即返回结束查询
return item
children.push(. . .item.children)//此处按顺序将当前层的所有子节点入队
})
return deep(children,name) //若当前层无匹配则进入下一层 ,
}else{//未给定节点 及 查找结束
return null
}
}
深度优先搜索:
function deep(tree,name){
if(tree.children. length ()>0){
tree.children.forEach(item=>{//此处循环可以认为是为每个子节点构建栈
if(iteme.value == name)//当前节点匹配时提前
return item
let temp = deep(item))//此处利用递归特性形成栈的效果
if(temp!=null) //某个节点有数据时 返回数据,结束查询
return temp
})
return null //此处为某个深度的节点所有子叶都不匹配时
}else{
if(tree.value == name)
return tree
else
return null
}
}
对比以上代码我们发现两者代码非常相似,都是通过递归遍历所有子节点来搜索匹配给定值,
但广度优先搜索在进入某一层时会先将该层节点完全比对完才会递归至下一层,而深度优先搜索则会在比对完一个节点后立即递归其子节点。就像横着切豆腐和竖着切豆腐一样。