
LeetCode之N叉树的后序遍历(590)
定义递归函数: 初始化结果列表:用于存储后序遍历的结果。 递归处理:对于每个节点,递归处理其所有子节点。 添加节点值:在所有子节点处理完毕后,将当前节点的值添加到结果列表中。 初始化栈:将根节点压入栈。 遍历栈:处理栈顶节点,直到栈为空。 处理节点:如果节点尚未处理,先处理其右子树,再处理左子树。 添加节点值:当节点处理完毕后,将其值添加到结果列表中。
发布日期:2021-05-07 08:53:18
浏览次数:28
分类:精选文章
本文共 1651 字,大约阅读时间需要 5 分钟。
后序遍历的实现
后序遍历是一种树遍历方式,按照从左到右的顺序访问左子树、右子树,然后访问根节点。这种遍历方式常用于计算某些树的特性,如计算子树的大小、和等。
递归方法
递归方法是解决后序遍历问题的直观方式。递归函数遍历每个节点的子节点,然后将节点值添加到结果列表中。具体步骤如下:
postorder(root)
,接受树的根节点作为参数。代码示例:
class Node: def __init__(self, val=None, children=None): self.val = val self.children = childrenclass Solution: def postorder(self, root): result = [] def helper(node): if not node: return for child in node.children: helper(child) result.append(node.val) helper(root) return result
解释:helper
函数递归遍历每个节点的子节点,确保先处理左子树,再处理右子树。处理完所有子节点后,添加当前节点的值到结果列表中。
迭代方法
迭代方法使用栈来模拟递归过程,避免递归深度过大的问题。具体步骤如下:
代码示例:
class Node: def __init__(self, val=None, children=None): self.val = val self.children = childrenclass Solution: def postorder(self, root): if not root: return [] result = [] stack = [(root, False)] while stack: node, visited = stack.pop() if not visited: stack.append((node, True)) for child in reversed(node.children): stack.append((child, False)) else: result.append(node.val) return result
解释:栈中每个元素包含节点和一个标志位。未处理时,节点及其子节点被压入栈,标志位设为True时,表示节点已处理,值被添加到结果列表中。通过反转子节点顺序,确保先处理左子树,再处理右子树。
总结
无论是递归方法还是迭代方法,都能有效地实现后序遍历。递归方法简洁明了,但可能存在栈深度限制的问题。迭代方法通过栈模拟了递归过程,避免了递归深度过大的问题,适用于大规模树结构。两种方法都能正确生成树节点的后序遍历结果。
发表评论
最新留言
留言是一种美德,欢迎回访!
[***.207.175.100]2025年04月13日 20时12分21秒
关于作者

喝酒易醉,品茶养心,人生如梦,品茶悟道,何以解忧?唯有杜康!
-- 愿君每日到此一游!
推荐文章
MVC学习系列13--验证系列之Remote Validation
2019-03-06
多线程之volatile关键字
2019-03-06
2.1.4奇偶校验码
2019-03-06
2.2.2原码补码移码的作用
2019-03-06
多线程之Lock显示锁
2019-03-06
ForkJoinPool线程池
2019-03-06
【Struts】配置Struts所需类库详细解析
2019-03-06
Java面试题:Servlet是线程安全的吗?
2019-03-06
DUBBO高级配置:多注册中心配置
2019-03-06
Java集合总结系列2:Collection接口
2019-03-06
Linux学习总结(九)—— CentOS常用软件安装:中文输入法、Chrome
2019-03-06
大白话说Java反射:入门、使用、原理
2019-03-06
集合系列 Set(八):TreeSet
2019-03-06
JVM基础系列第11讲:JVM参数之堆栈空间配置
2019-03-06
MySQL用户管理:添加用户、授权、删除用户
2019-03-06
比技术还重要的事
2019-03-06
linux线程调度策略
2019-03-06
软中断和实时性
2019-03-06
Linux探测工具BCC(可观测性)
2019-03-06
Opentelemetry Metrics SDK
2019-03-06