找回密码
 立即注册
查看: 3|回复: 0

牛客网4499题解析:折纸问题背后的二叉树原理

[复制链接]
  • 打卡等级:初来乍到
  • 打卡总天数:4
  • 打卡月天数:4
  • 打卡总奖励:29
  • 最近打卡:2025-07-12 15:59:50

7

主题

2

回帖

2316

积分

VIP

积分
2316
发表于 3 天前 | 显示全部楼层 |阅读模式

截图未命名.jpg
一、 问题本质分析
每次对折都会在原有折痕序列的每对相邻折痕之间插入新的折痕,形成如下规律:
  • 奇数位置总是"down"
  • 偶数位置总是"up" 这实际上构成了一个完全二叉树中序遍历序列

二、算法设计思路
  • 递归建模:将每次折叠视为二叉树的生长

    • 左子树代表新产生的下折痕
    • 右子树代表新产生的上折痕

  • 中序遍历:按照"左-根-右"的顺序访问节点
  • 空间优化:直接生成结果,无需存储整个树结构

三、 复杂度分析四、完整代码
  1. class FoldPaper {
  2. public:
  3. vector<string> foldPaper(int n) {
  4. vector<string> res;
  5. if (n < 1) return res; // 边界条件处理

  6. // 模拟折纸过程,实际上是中序遍历二叉树
  7. inOrder(1, n, true, res); // 根节点是下折痕
  8. return res;
  9. }

  10. // 递归实现的中序遍历
  11. void inOrder(int i, int n, bool isDown, vector<string>& res) {
  12. if (i > n) return; // 递归终止条件

  13. inOrder(i + 1, n, true, res); // 遍历左子树(总是下折痕)
  14. res.push_bACk(isDown ? "down" : "up"); // 当前节点
  15. inOrder(i + 1, n, false, res); // 遍历右子树(总是上折痕)
  16. }
  17. }
复制代码



来源:牛客网4499题解析:折纸问题背后的二叉树原理

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

SEO网站 ( 冀ICP备2025113422号-2 )|网站地图

Powered by Discuz! X3.5

快速回复 返回顶部 返回列表