查看: 16|回复: 0

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

[复制链接]
  • TA的每日心情

    前天 14:55
  • 签到天数: 21 天

    [LV.4]偶尔看看III

    20

    主题

    0

    回帖

    47

    积分

    新手上路

    Rank: 1

    积分
    47
    发表于 昨天 12:08 | 显示全部楼层 |阅读模式


    一、 问题本质分析
    每次对折都会在原有折痕序列的每对相邻折痕之间插入新的折痕,形成如下规律:
    • 奇数位置总是"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++


    回复

    使用道具 举报

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

    本版积分规则

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