当前位置:   article > 正文

Leetcode0590: N 叉树的后序遍历(simple, 递归,迭代)_离散数学多叉树的后序遍历

离散数学多叉树的后序遍历

目录

1. 题目描述

2. 解题分析

2.1 递归

2.2 迭代

3. 代码实现


1. 题目描述


给定一个 n 叉树的根节点 root ,返回 其节点值的 后序遍历

n 叉树 在输入中按层序遍历进行序列化表示,每组子节点由空值 null 分隔(请参见示例)。

示例 1:
输入:root = [1,null,3,2,4,null,5,6]
输出:[5,6,3,2,4,1]

 

示例 2:
输入:root = [1,null,2,3,4,5,null,null,6,7,null,8,null,9,10,null,null,11,null,12,null,13,null,null,14]
输出:[2,6,14,11,7,3,12,8,4,13,9,10,5,1]

 

提示:
节点总数在范围 [0, 10^4] 内
0 <= Node.val <= 10^4
n 叉树的高度小于或等于 1000

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

来源:力扣(LeetCode)
链接:https://leetcode-cn.com/problems/n-ary-tree-postorder-traversal
著作权归领扣网络所有。商业转载请联系官方授权,非商业转载请注明出处。

2. 解题分析

2.1 递归

        N叉树的后序遍历与二叉树的后序遍历基本相同。

        是先遍历所有子树,最后遍历节点自身。参考Leetcode0145: 二叉树的后序遍历

        代码参见:postorderRecursion()

2.2 迭代

        与二叉树遍历一样,也可以用迭代的方式来实现。

        但是由于N叉树的N是不确定的(二叉树确定性地最多只有左子树和右子树),所以一方面需要使用for-loop循环处理来遍历children;另一方面,由于是for-loop内嵌于while循环之中,break/continue的控制需要注意,与二叉树时有差异。处理流程如下:

        (1)栈、visited、ans初始化

        (2)将根节点入栈,同时将根节点加入visited

        (3)当栈不为空:

                (3-1)从栈中弹出一个节点

                (3-2)遍历该节点的子节点,对于每个不在visited中的子节点:

                        如果该子节点为叶子节点,将其值加入ans以及visited,回到(3-2)

                        如果该子节点不是叶子节点,将该节点和该子节点入栈,回到(3)                

                (3-4)如果该节点还有子节点待处理(即尚未加入ans)回到(3)

                (3-5)将其值加入ans,将其加入visited,回到(3)

        以以上示例1为例,围绕进出栈的处理步骤如下所示:

        (1) 1入

        (2) 1出

        (3) 1入,3入

        (4) 3出,进ans/visited

        (5) 3入,5入

        (6) 5出,进ans/visited

        (7) 3出

        (8) 3入,6入

        (9) 6出,进ans/visited

        (10) 3出,进ans/visited

        (11) 1出

        (12) 1入,2入

        (13) 2出,进ans/visited

        (14) 1出

        (15) 1入,4入

        (16) 4出,进ans/visited

        (17) 1出,进ans/visited

        虽然略显繁琐,但是手动推演一遍,是确保完全理解的必经之路。

3. 代码实现

  1. import time
  2. from typing import List
  3. from collections import deque
  4. # Definition for a binary tree node.
  5. class TreeNode:
  6. def __init__(self, val=0, left=None, right=None):
  7. self.val = val
  8. self.left = left
  9. self.right = right
  10. class Solution:
  11. # def postorderTraversal(self, root: Optional[TreeNode]) -> List[int]:
  12. def postorderTraversalRecursion(self, root: TreeNode) -> List[int]:
  13. if root==None:
  14. return []
  15. ans = []
  16. if root.left != None:
  17. left_lst = self.postorderTraversal(root.left)
  18. ans = ans + left_lst
  19. if root.right != None:
  20. right_lst = self.postorderTraversal(root.right)
  21. ans = ans + right_lst
  22. ans.append(root.val)
  23. return ans
  24. def postorderTraversalIteration(self, root: TreeNode) -> List[int]:
  25. if root==None:
  26. return []
  27. ans = []
  28. s = deque() # Used as stack, instead of FIFO
  29. visited = set()
  30. s.append(root)
  31. while len(s)>0:
  32. hasChildrenNotYetProcessed = False
  33. node = s.pop()
  34. for child in node.children:
  35. if (child not in visited):
  36. s.append(node)
  37. s.append(child)
  38. hasChildrenNotYetProcessed = True
  39. break
  40. if hasChildrenNotYetProcessed:
  41. continue
  42. ans.append(node.val)
  43. visited.add(node)
  44. return ans

回到主目录:笨牛慢耕的Leetcode解题笔记(动态更新。。。)icon-default.png?t=M276https://chenxiaoyuan.blog.csdn.net/article/details/123040889

声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/2023面试高手/article/detail/547608
推荐阅读