题目
给定一个 N 叉树,返回其节点值的后序遍历。
示例
给定一个三叉树:
1
/ | \
3 2 4
/ \
5 6
返回其后序遍历: [5,6,3,2,4,1]
解法
递归( Python )
class Solution:
def __init__(self):
self.res = []
def postorder(self, root: 'Node') -> List[int]:
if(root == None):
return []
for node in root.children:
self.postorder(node)
self.res.append(root.val)
return self.res
基本思路
本质上,先序遍历和后序遍历访问节点的顺序是相同的,只是将val
加入到res
的时机不同。先序遍历在访问子节点前就将val
放入res
,但是后序遍历在访问完子节点之后才将val
放入res
。
复杂度分析
因为需要遍历每一个节点,所以时间复杂度为 。空间上在树只有单节点时复杂度最差为 ,平均情况为 。
迭代实现( Python )
class Solution:
def postorder(self, root: 'Node') -> List[int]:
res, n_stack = [], root and [root]
while n_stack:
node = n_stack.pop()
res.append(node.val)
n_stack += node.children
res.reverse()
return res
基本思路
后序遍历实际上可以从右至左的先序遍历来实现。先序遍历的输出顺序是根-左-右
,后序遍历是左-右-根
,那么如果把先序遍历从左至右访问孩子节点的顺序改成从右至左,变成根-右-左
,再逆序输出,是不是就和后序遍历一样了?
复杂度分析
时间复杂度为 。空间上用了一个栈来实现迭代,不考虑只有根节点的极端情况,满T叉树时栈的最大深度为倒数第二层的节点数量+2,倒数第二层节点数量为 (k为总层数),树的总节点数为 ,两者相除,可以得出空间复杂度为 。