折纸问题

阐述

请把纸条竖着放在桌⼦上,然后从纸条的下边向上⽅对折,压出折痕后再展开。此时有 1 条折痕,突起的⽅向指向纸条的背⾯,这条折痕叫做“下”折痕 ;突起的⽅向指向纸条正⾯的折痕叫做“上”折痕。如果每次都从下边向上⽅ 对折,对折 N 次。请从上到下计算出所有折痕的⽅向。

给定折的次数 n,请返回从上到下的折痕的数组,若为下折痕则对应元素为"down",若为上折痕则为"up".

样例

输入:1
返回:["down"]

输入:2
返回:["down", "down", "up"]

思路

  • 模型为满二叉树
  • 通过层序遍历构造这颗树
  • 通过中序遍历打印这颗树

实现

function Tree(value) {
  this.value = value
  this.left = null
  this.right = null
}

// 此函数的代码为核心代码
function createTree(n) {
  let t0 = new Tree('down')
  let oldArr = [t0]
  let tempArr = []
  for (let i = 1; i < n; i++) {
    while (oldArr.length > 0) {
      let t = oldArr.shift()
      t.left = new Tree('down')
      t.right = new Tree('up')
      tempArr.push(t.left)
      tempArr.push(t.right)
    }
    oldArr = tempArr
    tempArr = []
  }
  return t0
}

function inOrderTree(t, cb) {
  function _inOrder(t) {
    if (t.left) {
      _inOrder(t.left)
    }
    cb(t.value)
    if (t.right) {
      _inOrder(t.right)
    }
  }
  _inOrder(t)
}

function fold(n) {
  let tree = createTree(n)
  let arr = []
  inOrderTree(tree, (v) => {
    arr.push(v)
  })
  return `[${arr.join(',')}]`
}
// no-log

测试

// log
// 1次
console.log(fold(1))
// 2次
console.log(fold(2))
// 3次
console.log(fold(3))
// 4次
console.log(fold(4))

来源

https://www.nowcoder.com/questionTerminal/430180b66a7547e1963b69b1d0efbd3c

posted @ 2020-09-27 21:29  oceans-pro  阅读(176)  评论(0编辑  收藏  举报