📜  数据结构|树遍历|问题10(1)

📅  最后修改于: 2023-12-03 15:10:20.214000             🧑  作者: Mango

数据结构 | 树遍历 | 问题10

问题描述

给定一颗二叉树,返回其节点值的前序遍历。

示例

示例1:

输入:

    1
     \
      2
     /
    3

输出:[1, 2, 3]

示例2:

输入:

        1
       / \
      4   2
         /
        3

输出:[1, 4, 2, 3]

解法

前序遍历的顺序是:节点 -> 左子树 -> 右子树。

递归实现:

当遇到节点不为空的情况,将其加入遍历序列中,并将左、右子树(在节点不为空的情况下)递归遍历。

迭代实现:

利用栈的特性将节点入栈,每次取出栈顶节点进行遍历,并将其右、左子树(在节点不为空的情况下)分别压进栈中,保证左子树先于右子树入栈,左子树后于右子树出栈。

代码实现

递归实现:

class Solution:
    def preorderTraversal(self, root: TreeNode) -> List[int]:
        res = []

        def traversal(node):
            if node:
                res.append(node.val)
                traversal(node.left)
                traversal(node.right)

        traversal(root)

        return res

迭代实现:

class Solution:
    def preorderTraversal(self, root: TreeNode) -> List[int]:
        res = []
        stack = []

        while root or stack:
            while root:
                res.append(root.val)
                stack.append(root)
                root = root.left

            root = stack.pop()
            root = root.right

        return res
复杂度分析
  • 时间复杂度:

递归实现 O(n),每一个节点都需要访问一次。

迭代实现 O(n),每一个节点都需要访问一次。

  • 空间复杂度:

递归实现 O(n),最坏情况下,树退化成一个链表,栈的空间复杂度为 O(n)。

迭代实现 O(n),最坏情况下,树为左子树退化成一个链表,栈的空间复杂度为 O(n)。