折纸问题
阐述
请把纸条竖着放在桌⼦上,然后从纸条的下边向上⽅对折,压出折痕后再展开。此时有 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