JavaScript树状结构遍历算法

87 阅读1分钟

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

欢迎您在底部评论区留言,一起交流~