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

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

[复制链接]
  • 打卡等级:即来则安
  • 打卡总天数:16
  • 打卡月天数:7
  • 打卡总奖励:111
  • 最近打卡:2025-07-12 15:59:47

21

主题

1

回帖

2469

积分

VIP会员

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


一、 问题本质分析
每次对折都会在原有折痕序列的每对相邻折痕之间插入新的折痕,形成如下规律:
  • 奇数位置总是"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题解析:折纸问题背后的二叉树原理
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

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