螺旋矩阵:

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
}