一、 问题本质分析每次对折都会在原有折痕序列的每对相邻折痕之间插入新的折痕,形成如下规律: 二、算法设计思路三、 复杂度分析四、完整代码
- class FoldPaper {
- public:
- vector<string> foldPaper(int n) {
- vector<string> res;
- if (n < 1) return res; // 边界条件处理
- // 模拟折纸过程,实际上是中序遍历二叉树
- inOrder(1, n, true, res); // 根节点是下折痕
- return res;
- }
- // 递归实现的中序遍历
- void inOrder(int i, int n, bool isDown, vector<string>& res) {
- if (i > n) return; // 递归终止条件
- inOrder(i + 1, n, true, res); // 遍历左子树(总是下折痕)
- res.push_bACk(isDown ? "down" : "up"); // 当前节点
- inOrder(i + 1, n, false, res); // 遍历右子树(总是上折痕)
- }
- }
复制代码
来源:牛客网4499题解析:折纸问题背后的二叉树原理
|