js矩陣


螺旋矩陣:

 

 

export default(arr)=>{
  //處理每一圈的數據遍歷過程
  let map=(arr,r=[])=>{
    for(let i=0,len=arr.length;i<len;i++){
      if(i===0){
        r=r.concat(arr[i])
      }else if(i===len-1){
        r=r.concat(arr[i],reverse())
      }else{
        r.push(arr[i].pop())
      }
    }
    arr.shift()
    arr.pop()
    for(let i=arr.length-1;i>=0;i--){
       r.push(arr[i].shift())
    }
    if(arr.length){
      return map(arr,r)
    }else{
      return r
    }
  }
  return map(arr,[])
}

  

旋轉圖像:

 

 

 

export default(arr)=>{
  // 獲取n的維度
  let vecor=arr.length
  //垂直反轉
  for(let i=0,len=vecor/2;i<len;i++){
    for(let j=0,tmp;j<vecor;j++){
       tmp=arr[i][j]
       arr[i][j]=arr[vecor-i-1][j]
       arr[vecor-i-1][j]=tmp
    }
  }
  //對角線翻轉
  for(let i=0;i<vecor;i++){
    for(let j=0,tmp;j<i;j++){
      tmp=arr[i][j]
      arr[i][j]=arr[j][i]
      arr[j][i]=tmp
    }
  }
  return arr
}

  二叉樹:

對稱的二叉樹:

 

 

 

  //二叉樹的節點
  class Node{
    constructor(val){
      this.val=val
      this.left=this.right=undefined
    }
  }
  class Tree{
    constructor(data){
      //臨時存儲所有節點,方便尋找父子節點
      let nodeList=[]
      //頂節點
      let root
      for(let i=0,len=data.length;i<len;i++){
        let node=new Node(data[i])
        nodeList.push(node)
        if(i>0){  //第一層
          //計算當前節點屬於哪一層
          let n=Math.floor( Math.sqrt(i+1))
          //記錄當前層的起始點
          let q=Math.pow(2,n)-1
          //記錄上一層的起始點
          let p=Math.pow(2,n-1)-1
          //找到當前節點的父節點
          let parent=nodeList[p+Math.floor((i-q)/2)]
          //將當前節點和上一層的父節點做關聯
          if(parent.left){
            parent.right=node
          }else{
            parent.left=node
          }
        }
      }
      root=nodeList.shift()
      nodeList.length=0 
      return root
    }
    //判斷是不是對稱
    static isSymmetry(root){
      if(!root){
        return true
      }
      let walk=(left,right)=>{
        if(!left&&!right){
          return true
        }
        if((left&&!right)||(!left&&right)||(left.val!==right.val)){
          return false
        }
        return walk(left.left,right.right)&&walk(left.right,right.left)
      }
      return walk(root.left,root.right)
    }
  }

  export default Tree

  export{
    Node
  }

  

class Node{
  constructor(val){
    this.val=val
    this.left=this.right=undefined
  }
}

class Tree{
  constructor(data){
    let root=new Node(data.shift())
    //遍歷所有的數據,逐漸插入到當前這顆搜索樹中
    data.array.forEach(item => {
      this.insert(root,item)
    });
    return root
  }
  insert(node,data){
    if(node.val>data){
      if(node.left===undefined){//判斷是不是左節點
        node.left=new Node(data)
      }else{
        this.insert(node.left,data)
      }
    }else{
      if(node.right===undefined){
        node.right=new Node(data)
      }else{
        this.insert(node.right,data)
      }
    }
  }

  static walk(root){
    if(!root.left&&!root.right){
      return true
    }else if((root.left&&root.val<root.left.val)||
    root.right&&root.val>root.right.val){
      return false
    }else{
      return Tree.walk(root.left)&&Tree.walk(root.right)
    }
  }
}

export default Tree
export{
  Node
}

  


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM