当前位置:首页 > 牛客 > 牛客4499题解:二叉树中序遍历

牛客4499题解:二叉树中序遍历

9个月前 (07-22)

牛客4499题解:二叉树中序遍历 牛客题解 二叉树 中序遍历 递归 C++ 第1张

一、题目解读

牛客4499题要求模拟折纸过程并输出折痕方向。题目给定整数n表示折纸次数,需要生成一个包含"down"(下折)和"up"(上折)的序列,反映每次折纸后的折痕排列。该问题本质上是数学建模算法的结合,需找到递归规律或数据结构来模拟折纸过程。

二、解题思路

采用二叉树中序遍历作为核心解法。观察折纸过程可发现,每次折叠将纸张分为左右两部分,折痕作为“根节点”,左部分始终为下折,右部分为上折。这种结构天然符合二叉的中序遍历顺序(左子树→根节点→右子树),因此可通过递归实现中序遍历,记录折痕方向。

三、解题步骤

1. 边界处理:当n<1时直接返回空结果,避免无效输入。

2. 递归函数设计:定义inOrder函数,参数包括当前位置i、总次数n、当前折痕方向isDown、结果数组res。

3. 中序遍历模拟:

递归遍历左子树(i+1到n,方向始终为下折)。

○ 处理当前节点:根据isDown添加"down"或"up"到res。

○ 递归遍历右子树(i+1到n,方向为上折)。

4. 主函数调用inOrder(1, n, true),从根节点(第一次折痕为下折)开始遍历,生成最终序列。

四、代码与注释

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); // 遍历右子树(总是上折痕)
    }
};

五、总结

该解法巧妙将折纸问题转化为二叉树中序遍历,利用递归的简洁性高效解决问题。核心在于识别问题中的递归结构(折痕分层),并通过中序遍历顺序自然生成结果。此思路对理解算法建模与树结构应用具有启发意义,适合算法面试或练习中的思维训练。


原创内容 转载请注明出处

分享给朋友:

相关文章

力扣70题:告别暴力递归!从零实现记忆化搜索解法

力扣70题:告别暴力递归!从零实现记忆化搜索解法

题意解析:想象你站在楼梯底部,面前有n级台阶。每次你可以选择跨1级或2级台阶,最终到达顶端的路径有多少种不同的走法?这个问题本质上是在探索分叉决策的叠加效果——当我们把每个台阶处的选择看作二叉树的分支...

力扣第92题:三步定位 精准反转链表指定区间

力扣第92题:三步定位 精准反转链表指定区间

题目解读给定一个单链表和两个整数left与right,要求将链表中从第left个节点到第right个节点的部分进行反转,而保持其他部分不变。例如,对于链表1→2→3→4→5,left=2,right=...

力扣第1991题:寻找数组的中心索引 如何找到左右和相等的中心索引

力扣第1991题:寻找数组的中心索引 如何找到左右和相等的中心索引

题目解读给定一个整数数组,我们需要找到一个中心索引,使得该索引左侧所有元素的和等于右侧所有元素的和。如果不存在这样的索引,则返回-1。中心索引的定义不包含在左右两侧的和计算中。这个问题考察对数组遍历和...

力扣933题:队列的妙用:如何高效统计最近请求

力扣933题:队列的妙用:如何高效统计最近请求

题目重解:我们需要设计一个能统计最近3000毫秒内请求次数的系统。每当新的请求到来时,它会带有时间戳t,我们需要返回过去3000毫秒内(包括当前)发生的请求总数。这就像是在时间轴上维护一个滑动窗口,只...

IOI 1994 洛谷1216:如何用O(1)空间解决数字三角形问题?附代码实现

IOI 1994 洛谷1216:如何用O(1)空间解决数字三角形问题?附代码实现

题目重解:数字三角形是一个经典的动态规划问题,给定一个由数字组成的三角形结构,从顶部出发,每次可以移动到下方相邻的数字,最终到达底部。我们需要找到一条路径,使得路径上经过的数字总和最大。这个问题可以很...

力扣965题深度解析:单值二叉树的判断技巧

力扣965题深度解析:单值二叉树的判断技巧

重新解读题目 判断一棵二叉树是否为“单值二叉树”,即所有节点的值是否完全相同。题目看似简单,实则考验对树结构递归特性的理解。若一棵树的所有节点值相同,其必然满足:根节点与左右子树的值一致,且...

发表评论

访客

看不清,换一张

◎欢迎参与讨论,请在这里发表您的看法和观点。