LeetCode N叉树的后序遍历

题目

  给定一个 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

复杂度分析

  因为需要遍历每一个节点,所以时间复杂度为 O ( N ) O \left( N \right) 。空间上在树只有单节点时复杂度最差为 O ( N ) O \left( N \right) ,平均情况为 O ( l o g N ) O \left( logN \right)

迭代实现( 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
基本思路

  后序遍历实际上可以从右至左的先序遍历来实现。先序遍历的输出顺序是根-左-右,后序遍历是左-右-根,那么如果把先序遍历从左至右访问孩子节点的顺序改成从右至左,变成根-右-左,再逆序输出,是不是就和后序遍历一样了?

复杂度分析

  时间复杂度为 O ( N ) O \left( N \right) 。空间上用了一个栈来实现迭代,不考虑只有根节点的极端情况,满T叉树时栈的最大深度为倒数第二层的节点数量+2,倒数第二层节点数量为 T k 2 T^{k-2} (k为总层数),树的总节点数为 1 T k 1 T \frac{1-T^k}{1-T} ,两者相除,可以得出空间复杂度为 O ( N ) O \left( N\right)

猜你喜欢

转载自blog.csdn.net/disguise666/article/details/89300044