题目描述
思路解析动画文字版
记住「先记根,再左,再右」,递归栈负责回溯。下面逐帧走一遍这棵树。
前序遍历(根→左→右):先看清这棵树:根是 50,它的左孩子 30(下面挂着 20、40)、右孩子 80(下面挂着 70)。前序遍历从根 50 出发,一路「先根后左再右」地往下走。
前序遍历(根→左→右):递归进入节点 值50(紫色)。前序的规矩是「根在最前」,所以一进来先轮到 值50 自己。
前序遍历(根→左→右):把 值50 记进结果(它变绿),现在结果是 [50]。根记完了,接着先钻它的左子树。
前序遍历(根→左→右):递归进入节点 值30(紫色)。前序的规矩是「根在最前」,所以一进来先轮到 值30 自己。
前序遍历(根→左→右):把 值30 记进结果(它变绿),现在结果是 [50, 30]。根记完了,接着先钻它的左子树。
前序遍历(根→左→右):递归进入节点 值20(紫色)。前序的规矩是「根在最前」,所以一进来先轮到 值20 自己。
前序遍历(根→左→右):把 值20 记进结果(它变绿),现在结果是 [50, 30, 20]。根记完了,接着先钻它的左子树。
前序遍历(根→左→右):值20 这棵子树全部遍历完毕,从递归里返回到上一层 值30。
前序遍历(根→左→右):值30 的左子树整段都走完了,递归回到 值30。前序里左边处理完,接下来轮到它的右子树。
前序遍历(根→左→右):递归进入节点 值40(紫色)。前序的规矩是「根在最前」,所以一进来先轮到 值40 自己。
前序遍历(根→左→右):把 值40 记进结果(它变绿),现在结果是 [50, 30, 20, 40]。根记完了,接着先钻它的左子树。
前序遍历(根→左→右):值40 这棵子树全部遍历完毕,从递归里返回到上一层 值30。
前序遍历(根→左→右):值30 这棵子树全部遍历完毕,从递归里返回到上一层 值50。
前序遍历(根→左→右):值50 的左子树整段都走完了,递归回到 值50。前序里左边处理完,接下来轮到它的右子树。
前序遍历(根→左→右):递归进入节点 值80(紫色)。前序的规矩是「根在最前」,所以一进来先轮到 值80 自己。
前序遍历(根→左→右):把 值80 记进结果(它变绿),现在结果是 [50, 30, 20, 40, 80]。根记完了,接着先钻它的左子树。
前序遍历(根→左→右):递归进入节点 值70(紫色)。前序的规矩是「根在最前」,所以一进来先轮到 值70 自己。
前序遍历(根→左→右):把 值70 记进结果(它变绿),现在结果是 [50, 30, 20, 40, 80, 70]。根记完了,接着先钻它的左子树。
前序遍历(根→左→右):值70 这棵子树全部遍历完毕,从递归里返回到上一层 值80。
前序遍历(根→左→右):值80 没有右孩子,右子树为空。到这儿,值80 的左、右子树都处理完了。
前序遍历(根→左→右):值80 这棵子树全部遍历完毕,从递归里返回到上一层 值50。
前序遍历(根→左→右):值50 是根,它的整棵树都遍历完了,递归回到最外层,前序遍历到此结束。
前序遍历(根→左→右):整棵树前序遍历完成,结果是 50、30、20、40、80、70。回头看:每到一个节点都「先记自己、再左、再右」,递归栈帮我们记住回溯路径,每个节点恰好访问一次,所以是 O(n)。
边界:空树返回空、单节点只记根、退化链空间退化成 O(n)。
两个高频追问:显式栈迭代(先压右再压左);前中后序只差记录根的位置。
参考代码
from typing import List, Optionalclass TreeNode: def __init__(self, val=0, left=None, right=None): self.val = val self.left = left self.right = rightclass Solution: def preorderTraversal(self, root: Optional[TreeNode]) -> List[int]: ans = [] def dfs(node): if node: ans.append(node.val); dfs(node.left); dfs(node.right) dfs(root) return ans复杂度
- 时间:O(n),每个节点恰好被访问、被记录一次,n 是节点总数
- 空间:O(h),递归调用栈的深度等于树高 h;平衡树约 O(log n),退化成链时最坏 O(n)
易错点
面试追问把动画讲成自己的话
追问不用递归怎么做前序?
追问前序、中序、后序在代码上差别在哪?
这道题到这就讲完了。动画和文字是同一套思路——别光看,关掉页面自己默写一遍。然后顺着主线继续:
二叉树的后序遍历
LeetCode 145 · 简单 · 沿着 树套路 继续往下推进
把这道题真正学会,再走
图解算法年卡 ¥99 /年
- ✓本题每步动画的吴师兄语音讲解(全站陆续覆盖)
- ✓小欧带 8 步通关训练——追问到不看答案也能写对、能 30 秒讲给面试官听
- ✓学习报告,记录每道题的掌握程度
76k+ GitHub Star · 吴师兄开源图解算法,几十万开发者在看的算法讲解
想成体系刷透这类套路?去图解算法专题