Tree easy** **

题目

给定一个 N 叉树,返回其节点值的前序遍历。例如,给定一个 3叉树 :
589. N叉树的前序遍历 - 图1
返回其前序遍历: [1, 3, 5, 6, 2, 4]

说明:递归法很简单,你可以使用迭代法完成此题吗?

思路

方法一:迭代
由于递归实现 N 叉树的前序遍历较为简单,因此我们只讲解如何使用迭代的方法得到 N 叉树的前序遍历。

我们使用一个栈来帮助我们得到前序遍历,需要保证栈顶的节点就是我们当前遍历到的节点。我们首先把根节点入栈,因为根节点是前序遍历中的第一个节点。随后每次我们从栈顶取出一个节点 u ,它是我们当前遍历到的节点,并把 u 的所有子节点逆序推入栈中。例如 u 的子节点从左到右为 v1, v2, v3 ,那么推入栈的顺序应当为 v3, v2, v1 ,这样就保证了下一个遍历到的节点(即 u 的第一个子节点 v1 )出现在栈顶的位置。

复杂度分析**

  • 时间复杂度:时间复杂度: O(M) ,其中 MN 叉树中的节点个数。每个节点只会入栈和出栈各一次。
  • 空间复杂度: O(M) 。在最坏的情况下,这棵 N 叉树只有 2 层,所有第 2 层的节点都是根节点的孩子。将根节点推出栈后,需要将这些节点都放入栈,共有 M - 1 个节点,因此栈的大小为 O(M)

代码实现

  1. # N叉树遍历
  2. # 时间复杂度:时间复杂度:O(M),其中 M 是 N 叉树中的节点个数。每个节点只会入栈和出栈各一次。
  3. # 空间复杂度:O(M)。在最坏的情况下,这棵 N 叉树只有 2 层,所有第 2 层的节点都是根节点的孩子。
  4. # 将根节点推出栈后,需要将这些节点都放入栈,共有 M−1个节点,因此栈的大小为 O(M)。
  5. """
  6. # Definition for a Node.
  7. class Node:
  8. def __init__(self, val=None, children=None):
  9. self.val = val
  10. self.children = children
  11. """
  12. # N叉树简洁递归
  13. class Solution:
  14. def preorder(self, root: 'Node') -> List[int]:
  15. if not root: return []
  16. res = [root.val]
  17. for node in root.children:
  18. res.extend(self.preorder(node))
  19. return res
  20. # N叉树通用递归模板
  21. class Solution:
  22. def preorder(self, root: 'Node') -> List[int]:
  23. res = []
  24. def helper(root):
  25. if not root:
  26. return
  27. res.append(root.val)
  28. for child in root.children:
  29. helper(child)
  30. helper(root)
  31. return res
  32. # N叉树迭代方法
  33. class Solution:
  34. def preorder(self, root: 'Node') -> List[int]:
  35. if not root:
  36. return []
  37. s = [root]
  38. # s.append(root)
  39. res = []
  40. while s:
  41. node = s.pop()
  42. res.append(node.val)
  43. # for child in node.children[::-1]:
  44. # s.append(child)
  45. s.extend(node.children[::-1])
  46. return res