返回

一道简单却又综合了多种知识点的LeetCode算法题:N叉树的前序遍历

闲谈

一、题目

给你一个 n 叉树的根节点  root ,返回其节点值的 前序遍历。

N 叉树 在输入中按层序遍历进行序列化表示,每组子节点由空值 null 分隔(请参见示例)。

 

示例 1:

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

示例 2:

输入:root = [1,null,2,3,4,5,null,null,6,7,null,8,null,9,10,null,null,11,null,12,13,null,null,14]
输出:[1,2,3,4,5,6,7,8,9,10,11,12,13,14]

 

提示:

n叉树的高度小于或等于 1000
n叉树的节点总数在[0, 10^4] 范围内
 

二、解题思路

前序遍历是一种树的遍历方式,它按照 根 - 左子树 - 右子树 的顺序访问树中的节点。N叉树的前序遍历与二叉树的前序遍历类似,但N叉树每个节点可能有多个子节点,因此在遍历时需要对每个子节点都进行前序遍历。

我们可以使用递归或迭代的方法来实现N叉树的前序遍历。

  1. 递归方法

递归方法的思路很简单,就是先访问根节点,然后递归地访问每个子节点。

def preorder_traversal_recursive(root):
  if root is None:
    return

  # 访问根节点
  print(root.val)

  # 递归地访问每个子节点
  for child in root.children:
    preorder_traversal_recursive(child)
  1. 迭代方法

迭代方法使用栈来实现N叉树的前序遍历。算法的步骤如下:

  1. 将根节点压入栈中。
  2. 只要栈不为空,就弹出栈顶元素并访问它。
  3. 将栈顶元素的所有子节点从左到右依次压入栈中。
def preorder_traversal_iterative(root):
  if root is None:
    return

  # 创建一个栈
  stack = [root]

  # 只要栈不为空,就弹出栈顶元素并访问它
  while stack:
    node = stack.pop()
    print(node.val)

    # 将栈顶元素的所有子节点从左到右依次压入栈中
    for child in node.children[::-1]:
      stack.append(child)

三、代码实现

class Node:
  def __init__(self, val, children):
    self.val = val
    self.children = children

def preorder_traversal_recursive(root):
  if root is None:
    return

  # 访问根节点
  print(root.val)

  # 递归地访问每个子节点
  for child in root.children:
    preorder_traversal_recursive(child)

def preorder_traversal_iterative(root):
  if root is None:
    return

  # 创建一个栈
  stack = [root]

  # 只要栈不为空,就弹出栈顶元素并访问它
  while stack:
    node = stack.pop()
    print(node.val)

    # 将栈顶元素的所有子节点从左到右依次压入栈中
    for child in node.children[::-1]:
      stack.append(child)

四、复杂度分析

  1. 时间复杂度:

    • 递归方法的时间复杂度为O(n),其中n是树中的节点数。这是因为递归方法会访问每个节点一次。
    • 迭代方法的时间复杂度也为O(n)。这是因为迭代方法使用栈来存储节点,而栈的弹出和压入操作都是O(1)的。
  2. 空间复杂度:

    • 递归方法的空间复杂度为O(h),其中h是树的高度。这是因为递归方法需要使用栈来存储当前正在遍历的节点,而栈的大小与树的高度成正比。
    • 迭代方法的空间复杂度为O(h)。这是因为迭代方法也使用栈来存储节点,而栈的大小与树的高度成正比。