题目
给定一个 N 叉树,返回其节点值的前序遍历。例如,给定一个 3叉树 :
返回其前序遍历: [1, 3, 5, 6, 2, 4]
思路
方法一:迭代
由于递归实现 N 叉树的前序遍历较为简单,因此我们只讲解如何使用迭代的方法得到 N 叉树的前序遍历。
我们使用一个栈来帮助我们得到前序遍历,需要保证栈顶的节点就是我们当前遍历到的节点。我们首先把根节点入栈,因为根节点是前序遍历中的第一个节点。随后每次我们从栈顶取出一个节点 u ,它是我们当前遍历到的节点,并把 u 的所有子节点逆序推入栈中。例如 u 的子节点从左到右为 v1, v2, v3 ,那么推入栈的顺序应当为 v3, v2, v1 ,这样就保证了下一个遍历到的节点(即 u 的第一个子节点 v1 )出现在栈顶的位置。
复杂度分析**
- 时间复杂度:时间复杂度:
O(M),其中M是N叉树中的节点个数。每个节点只会入栈和出栈各一次。 - 空间复杂度:
O(M)。在最坏的情况下,这棵N叉树只有2层,所有第2层的节点都是根节点的孩子。将根节点推出栈后,需要将这些节点都放入栈,共有M - 1个节点,因此栈的大小为O(M)。
代码实现
# N叉树遍历# 时间复杂度:时间复杂度:O(M),其中 M 是 N 叉树中的节点个数。每个节点只会入栈和出栈各一次。# 空间复杂度:O(M)。在最坏的情况下,这棵 N 叉树只有 2 层,所有第 2 层的节点都是根节点的孩子。# 将根节点推出栈后,需要将这些节点都放入栈,共有 M−1个节点,因此栈的大小为 O(M)。"""# Definition for a Node.class Node:def __init__(self, val=None, children=None):self.val = valself.children = children"""# N叉树简洁递归class Solution:def preorder(self, root: 'Node') -> List[int]:if not root: return []res = [root.val]for node in root.children:res.extend(self.preorder(node))return res# N叉树通用递归模板class Solution:def preorder(self, root: 'Node') -> List[int]:res = []def helper(root):if not root:returnres.append(root.val)for child in root.children:helper(child)helper(root)return res# N叉树迭代方法class Solution:def preorder(self, root: 'Node') -> List[int]:if not root:return []s = [root]# s.append(root)res = []while s:node = s.pop()res.append(node.val)# for child in node.children[::-1]:# s.append(child)s.extend(node.children[::-1])return res
