和二叉树类似,N叉树的遍历也有递归和迭代两种写法,同时,递归写法比较简单。
具体题目参照leetcode589,590,429
结点定义:
class Node:
def __init__(self, val=None, children=None):
self.val = val
self.children = children
"""
仿照上一节的二叉树遍历写法,相信是可以写出来的~
递归法
前序遍历~
class Solution:
def preorder(self, root: 'Node') -> List[int]:
# N叉树的递归遍历,和二叉树的递归写法类似
def dfs(root):
if not root:return
res.append(root.val)
for node in root.children:
dfs(node)
res = []
dfs(root)
return res
后序遍历
class Solution:
def postorder(self, root: 'Node') -> List[int]:
def dfs(root):
if not root:return
for node in root.children:
dfs(node)
res.append(root.val)
res = []
dfs(root)
return res
迭代法
前序遍历
class Solution:
def preorder(self, root: 'Node') -> List[int]:
stack, res = [root], []
if not root:return []
while stack:
root = stack.pop()
res.append(root.val)
for node in root.children[::-1]:
stack.append(node)
return res
后序遍历
想一想二叉树,后序遍历和先序遍历的不同。后序遍历是左→右→根,先序遍历是根→左→右。所以其实按照先序遍历写法求出根→右→左,然后将列表逆序就可以了。
class Solution:
def postorder(self, root: 'Node') -> List[int]:
# 迭代法
stack, res=[root], []
if not root: return []
while stack:
root = stack.pop()
res.append(root.val)
for node in root.children:
stack.append(node)
return res[::-1]
层次遍历
借助队列来实现~
class Solution:
def levelOrder(self, root: 'Node') -> List[List[int]]:
if not root:return []
res = []
d = collections.deque()
d.append(root)
while d:
n = len(d)
tmp = []
for i in range(n):
root = d.popleft()
tmp.append(root.val)
for node in root.children:
d.append(node)
res.append(tmp)
return res
只能说和二叉树的层次遍历简直一模一样~不过就是把左右结点入栈,改为for循环遍历入栈。真的太简单了!!!