力扣 144:二叉树前序遍历的优雅实现

发布时间:2026/6/1 14:57:03

力扣 144:二叉树前序遍历的优雅实现 力扣 144二叉树前序遍历的优雅实现一、前序遍历核心规则二、递归设计三步定乾坤1. 定义函数意义核心第一步2. 边界条件递归终止3. 递归逻辑根→左→右三、代码实现极简且优雅代码关键说明四、递归思维看透本质五、思路迁移N叉树前序遍历总结在算法的世界里递归是一把精巧的钥匙能以极简逻辑拆解复杂结构。而二叉树的前序遍历正是练习递归思维的绝佳入口。今天我们就以力扣144题为例一步步拆解前序遍历的递归实现读懂递归的核心逻辑掌握通用解题思路。一、前序遍历核心规则前序遍历遵循根 → 左 → 右的访问顺序先访问当前根节点递归遍历左子树递归遍历右子树为了更直观理解我们用Mermaid绘制一棵简单二叉树根节点左子树右子树图表说明这是标准二叉树结构前序遍历会先访问根节点A再访问左子树B最后访问右子树C严格遵循根优先原则。二、递归设计三步定乾坤写递归代码的关键不是纠结递归展开过程而是先给函数明确的意义再写边界条件与递归逻辑这是通用的递归解题模板1. 定义函数意义核心第一步创建preorder函数传入两个参数root二叉树根节点ans存储遍历结果的数组函数意义对root为根的子树进行前序遍历并将结果追加到ans数组末尾。2. 边界条件递归终止当root为空时说明没有节点需要遍历直接终止递归避免无限调用。3. 递归逻辑根→左→右把当前节点值加入结果数组递归处理左子树递归处理右子树三、代码实现极简且优雅以力扣144题《二叉树的前序遍历》为例完整递归代码如下// 前序遍历递归函数 void preorder(TreeNode* root, vectorint ans) { // 边界条件空树直接返回 if (root nullptr) { return; } // 1. 访问根节点 ans.push_back(root-val); // 2. 递归左子树 preorder(root-left, ans); // 3. 递归右子树 preorder(root-right, ans); } // 主函数 vectorint preorderTraversal(TreeNode* root) { vectorint ans; preorder(root, ans); return ans; }代码关键说明边界判断root nullptr是递归的出口必须优先写防止栈溢出顺序严格根→左→右不可调换否则遍历顺序失效结果传递数组ans用引用传递全程共用一份空间时间复杂度O(n)空间复杂度O(n)递归栈结果数组四、递归思维看透本质很多初学者会纠结递归怎么一层层展开其实完全没必要写递归时我们只需要信任函数的意义调用preorder(root-left, ans)就默认它能正确完成左子树前序遍历不用关心内部细节专注当前层逻辑即可这就是递归的优雅之处用简单逻辑处理复杂树形结构。五、思路迁移N叉树前序遍历掌握二叉树前序遍历后可直接迁移到力扣589题 N叉树前序遍历核心逻辑完全一致先访问根节点依次递归遍历所有子节点边界条件与递归思想完全通用总结前序遍历核心根 → 左 → 右递归三步骤定意义→写边界→写逻辑关键原则信任函数意义不纠结递归展开性能优势递归代码极简时间复杂度最优O(n)递归是算法的基础思维吃透二叉树前序遍历中序、后序、N叉树遍历都能举一反三。下次我们继续拆解更多树形结构的递归技巧一起在算法之路上稳步前行

相关新闻