【刷题打卡】144. 二叉树的前序遍历

109 阅读1分钟

携手创作,共同成长!这是我参与「掘金日新计划 · 8 月更文挑战」的第3天,点击查看活动详情

一、题目描述:

144. 二叉树的前序遍历 - 力扣(LeetCode) (leetcode-cn.com)

给你二叉树的根节点 root ,返回它节点值的 前序 **遍历。

示例 1:

image.png

输入:root = [1,null,2,3]
输出:[1,2,3]

示例 2:

输入:root = []
输出:[]

示例 3:

输入:root = [1]
输出:[1]

示例 4:

image.png

输入:root = [1,2]
输出:[1,2]

示例 5:

image.png

输入: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

范文参考

图解 二叉树的四种遍历 - 二叉树的前序遍历 - 力扣(LeetCode)