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
}

  

posted @ 2020-08-18 21:32  石shi  阅读(909)  评论(0编辑  收藏  举报