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

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

[复制链接]
  • 打卡等级:即来则安
  • 打卡总天数:16
  • 打卡月天数:2
  • 打卡总奖励:124
  • 最近打卡:2025-08-15 15:43:54

22

主题

5

回帖

2395

积分

VIP

积分
2395
发表于 2025-7-14 12:11:17 | 显示全部楼层 |阅读模式


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

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

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

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

三、 复杂度分析
  • 时间复杂度:O(2^n) 每个节点访问一次
  • 空间复杂度:O(n) 递归深度

四、完整代码
  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. };
复制代码


来源:大矩学习资料
C++


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

本版积分规则

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

Powered by Discuz! X3.5

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