JavaScript遍历算法 - 墨抒颖 (msy.plus)
树状结构遍历算法
class Tree{
item:Tree[] = []
id:number
constructor(id?:number){
this.id = id && Number.isInteger(id)?id:((Math.random()*100000)|0)
}
push(...args:Tree[]){
this.item.push(...args)
return this
}
}
let tree = new Tree(1)
tree.push(
(new Tree(2)).push((new Tree(4))),
(new Tree(3)).push((new Tree(5)),(new Tree(6))),
)
// tree.push(
// (new Tree(1)).push(
// (new Tree(2)).push(
// (new Tree(3)).push(new Tree(4)),
// (new Tree(5)).push(new Tree(6)),
// (new Tree(7)),
// ),
// (new Tree(8)),
// (new Tree(9)),
// (new Tree(10)),
// )
// )
// 递归 递归处理,向深处延伸。从输出结果可以看出,错落有致的层级关系。
function FindItemById(item:Tree,id:number,tag=""):Tree|null{
if(item.id===id){
return item
}
let res:Tree|null=null
for(let i=0;i<item.item.length;i++){
console.log(tag+item.id)
res = FindItemById(item.item[i],id,tag+" ")
if(res){
return res
}
}
return res
}
console.log(FindItemById(tree,6))
// 栈模拟 深度优先遍历 1->2->3->5->6->4
function FindItemByIdUseStack(item:Tree,id:number):Tree|null{
let stack:Tree[] = []
stack.push(item)
let tag = ""
while(stack.length!==0){
let current = stack.pop()
if(current?.id===id){
return current
}
let list = current?.item
if(list){
for(let i=0;i<list.length;i++){
console.log(tag+list[i].id)
if(list[i]){
stack.push(list[i])
}
}
tag += " "
}
}
return null
}
console.log(FindItemByIdUseStack(tree,4))
// 队列 广度优先遍历 1->2->3->4->5->6
function FindItemByIdUseQueue(item:Tree,id:number):Tree|null{
let queue:Tree[] = []
queue.unshift(item)
let tag = ""
while(queue.length !==0){
let current = queue.pop()
if(current?.id===id){
return current
}
let list = current?.item
if(list){
for(let i=0;i<list.length;i++){
console.log(tag+list[i].id)
if(list[i]){
queue.unshift(list[i])
}
}
tag += " "
}
}
return null
}
console.log(FindItemByIdUseQueue(tree,6))
reference
欢迎您在底部评论区留言,一起交流~