携手创作,共同成长!这是我参与「掘金日新计划 · 8 月更文挑战」的第3天,点击查看活动详情
一、题目描述:
144. 二叉树的前序遍历 - 力扣(LeetCode) (leetcode-cn.com)
给你二叉树的根节点 root ,返回它节点值的 前序 **遍历。
示例 1:
输入:root = [1,null,2,3]
输出:[1,2,3]
示例 2:
输入:root = []
输出:[]
示例 3:
输入:root = [1]
输出:[1]
示例 4:
输入:root = [1,2]
输出:[1,2]
示例 5:
输入:root = [1,null,2]
输出:[1,2]
提示:
- 树中节点数目在范围 [0, 100] 内
- -100 <= Node.val <= 100
进阶:递归算法很简单,你可以通过迭代算法完成吗?
二、思路分析:
树的迭代遍历要借助栈。原理是也简单:
- 栈初始为stack = [根],结果列表为初始空列表rst = [];
- 栈顶元素TreeNode根节点弹出,根节点的属性再按顺序入栈(这里的顺序很重要,是决定哪个序的关键):stack.extend([右节点,值,左节点])。
- 然后再弹出栈顶元素。此时弹出的顺序就是[左节点,值,右节点]。
- 当弹出的元素是TreeNode节点而不是int值,将此节点的属性按上述入栈顺序继续入栈stack.extend([右节点,值,左节点])。
- 当弹出的元素是int值而不是TreeNode节点,将其放入结果列表 rst.append(值)。
- 当弹出的是None,不做任何处理。
- 然后再弹出栈顶元素,当元素是TreeNode节点...当元素是int值...如此循环直到栈空,rst就是遍历结果。
上述过程自己手动模拟一遍就很清楚了,过程中入栈顺序就是先/中/后遍历的反序。
三、AC 代码:
class Solution:
def inorderTraversal(self, root: TreeNode) -> List[int]:
stack,rst = [root],[]
while stack:
i = stack.pop()
if isinstance(i,TreeNode):
stack.extend([i.right,i.val,i.left]) ## 中序遍历
# stack.extend([i.val,i.right,i.left]) ## 后序遍历
# stack.extend([i.right,i.left,i.val]) ## 先序遍历
elif isinstance(i,int):
rst.append(i)
return rst
范文参考: