题目
给定一个 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 = val
self.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:
return
res.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