二叉树N叉数的前中后序遍历总结,python实现递归法和迭代法

关于二叉树的前序遍历(preoder)、中序遍历(inorder)和后序遍历(postorder),实际上只需要记住:左子节点一定在右子节点的左边(左右),所谓前中后序遍历就是根节点的位置不同,前序是根左右,中序是左根右,后序是左右根。

python代码实现,先定义树节点的类如下:

class TreeNode:def __init__(self, val=0, left=None, right=None):self.val = valself.left = leftself.right = right

然后是前中后序的递归法实现,非常直观:

    # 前序遍历def preorderTraversal(self, root: TreeNode) -> List[int]:def preorder(root: TreeNode):if not root:returnans.append(root.val) # 根左右preorder(root.left)preorder(root.right)ans = list()preorder(root)return ans# 中序遍历def inorderTraversal(self, root: TreeNode) -> List[int]:def inorder(root: TreeNode):if not root:returninorder(root.left)  # 左根右ans.append(root.val)inorder(root.right)ans = list()inorder(root)return ans# 后序遍历def postorderTraversal(self, root: TreeNode) -> List[int]:def postorder(root: TreeNode):if not root:returnpostorder(root.left) # 左右根postorder(root.right)ans.append(root.val)ans = list()postorder(root)return ans

可以看到,实际上前中后序的递归法实现区别仅仅在于访问左右子节点和将根节点加入结果数组的顺序不同。

迭代法实现复杂一点,一般是使用一个栈,如下:

	# 前序遍历def preorderTraversal(self, root: Optional[TreeNode]) -> List[int]:ans = []if not root:return ansstack = []stack.append(root)while stack:node = stack.pop()if node:if node.right:                  # 右stack.append(node.right)if node.left:					# 左stack.append(node.left)stack.append(node)				# 根stack.append(None)else:node = stack.pop()ans.append(node.val)return ans# 中序遍历def inorderTraversal(self, root: Optional[TreeNode]) -> List[int]:ans = []if not root:return ansstack = []stack.append(root)while stack:node = stack.pop()if node:if node.right:					# 右stack.append(node.right)stack.append(node)				# 根stack.append(None)if node.left:					# 左stack.append(node.left)else:node = stack.pop()ans.append(node.val)return ans# 后序遍历def postorderTraversal(self, root: Optional[TreeNode]) -> List[int]:ans = []if not root:return ansstack = []stack.append(root)while stack:node = stack.pop()if node:stack.append(node)				# 根stack.append(None)if node.right:					# 右stack.append(node.right)if node.left:					# 左stack.append(node.left)else:node = stack.pop()ans.append(node.val)return ans

可以看到,前中后序遍历的迭代写法是统一的,唯一区别就是中间的代码,只需要记住从下往上是根左右(前序)、左根右(中序)、左右根(后序)即可

对于N叉数,思路和二叉树是比较相似的。先看下N叉数的树节点定义:

# Definition for a Node.
class Node:def __init__(self, val=None, children=None):self.val = valself.children = children

589. N 叉树的前序遍历

class Solution:def preorder(self, root: 'Node') -> List[int]:def preorderTravel(root: 'Node'):if not root:returnans.append(root.val)for child in root.children:preorderTravel(child)ans = list()preorderTravel(root)return ans

递归写法,区别只是用for循环遍历所有子节点,而不是只遍历左右子节点。

class Solution:def preorder(self, root: 'Node') -> List[int]:if not root:return []stack = [root,]output = []            while stack:root = stack.pop()output.append(root.val)stack.extend(root.children[::-1])return output

迭代写法,这里注意入栈的是root.children[::-1],这样出栈时才是从左子树到右子树正确的顺序。

590. N 叉树的后序遍历

class Solution:def postorder(self, root: 'Node') -> List[int]:def postorderTravel(root: 'Node'):if not root:returnfor child in root.children:postorderTravel(child)ans.append(root.val)ans = list()postorderTravel(root)return ans

递归写法,相比前序遍历只是交换了一下位置,而N叉数没有中序遍历。

class Solution:def postorder(self, root: 'Node') -> List[int]:if not root:return []stack = [root,]output = []while stack:root = stack.pop()if root:output.append(root.val)for child in root.children:stack.append(child)return output[::-1]

迭代写法。

559. N 叉树的最大深度

class Solution:def maxDepth(self, root: 'Node') -> int:if not root:return 0elif root.children == []:return 1else:temp = list()for child in root.children:temp.append(self.maxDepth(child))return max(temp) + 1

递归,与二叉树的最大深度类似,注意要判断 root.children == [] 时深度为1。

还有一种遍历二叉树的方法,可以将空间复杂度降至O(1),名为Morris遍历,对其解释地最好的我觉得是这篇文章。

另外还有一种题,二叉树是存储成数组形式的,这时就要利用以下关系:根节点从0开始编号,对于任意一个节点 i,其左孩子编号为 2i+1,右孩子编号为 2i+2,代码如下:

#
# 对给定的二叉树依次完成前序,中序,后序遍历,并输出遍历结果
# @param input int整型一维数组 -1表示Nil节点
# @return int整型二维数组
#
# 定义一个二维列表
results = [[]for i in range(3)]
class Solution:def binaryTreeScan(self , input ):# write code here# 前序遍历def preOrder(root):if root<len(input):if input[root]!=-1:results[0].append(input[root])preOrder(root*2+1)preOrder(root*2+2)# 中序遍历def inOrder(root):if root<len(input):inOrder(root*2+1)if input[root]!=-1:results[1].append(input[root])inOrder(root*2+2)# 后序遍历def postOrder(root):if root<len(input):postOrder(root*2+1)postOrder(root*2+2)if input[root]!=-1:results[2].append(input[root])preOrder(0)inOrder(0)postOrder(0)return results

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/307678.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

Azure Cosmos Db 介绍及演示

Azure Cosmos DB 是 Microsoft 提供的全球分布式多模型数据库服务。Cosmos DB是一种NoSql数据库&#xff0c;但是它兼容多种API。它支持SQL, MongoDB、Cassandra或 Gremlin&#xff0c;你可以挑选自己喜欢的方式进行存储跟访问。主要优势统包式全局分发凭借 Cosmos DB&#xff…

二叉树层序遍历(广度优先搜索)基础概念与经典题目(Leetcode题解-Python语言)

二叉树的广度优先搜索即从上到下、从左到右地进行搜索&#xff0c;对于层序遍历&#xff08;Level Order&#xff09;问题&#xff0c;即依次遍历第一层节点、第二层节点…等&#xff0c;基本可以秒杀。 广度优先搜索是通过队列来实现的&#xff0c;python中优先用collections…

leetcode049. 最后一块石头的重量 II

一:题目 二:上码 class Solution { public:/**思路:1.分析题意只要我们将石头分为尽可能相同的两堆,他们的重量相减后剩余的重量就是最小。 物品的重量为stones[i];物品的价值也为stone[i];temp代表总重量的一半那么我们最终得到的stones[temp]:就是背包容量为temp的最大重量为…

大改革,GNOME 3.x将直接跳到GNOME 40

GNOME 3.38 发布后&#xff0c;GNOME 基金会宣布了用于 GNOME 的新版本控制方案&#xff0c;将于2021年3月发布的下一版 GNOME 将是 GNOME 40。你没看错&#xff0c;版本号直接从现在的 3.x 跳到了 40。以 GNOME 40 为例&#xff0c;其开发周期将包含三个阶段&#xff0c;对应的…

从前中后序遍历构造二叉树,三题无脑秒杀

如果只是前中后序遍历的其中一种&#xff0c;是不可能唯一确定一个二叉树的&#xff0c;必须是其中两个的结合&#xff0c;由此便产生了三道题目&#xff0c;在这里可以全部秒杀。 需要记住的要点是&#xff1a; 前序&#xff08;根左右&#xff09;——第一个节点一定是根节点…

.NET Core + Kubernetes:StatefulSet

在 Kubernetes 中&#xff0c;Pod 资源的控制器 Deployment、Replicaset、Daemonset 等常用于管理无状态应用&#xff0c;它们所管理的 Pod 对应的 IP、名字&#xff0c;启停顺序等都是随机的&#xff0c;Pod 之间也并不存在任何关联关系。而实际情况下&#xff0c;在应用集群部…

哈希表(散列表)基础概念与经典题目(Leetcode题解-Python语言)之上——原理与设计

哈希表&#xff08;Hash table&#xff0c;也叫散列表&#xff09;&#xff0c;是根据键&#xff08;Key&#xff09;而直接访问数据在内存中的储存位置&#xff08;又叫做存储桶&#xff0c;Buckets&#xff09;的数据结构。也就是说&#xff0c;它通过计算一个关于键值的函数…

python编程中的小问题汇总

前言 本文记录了我在python编程中遇到的各种小问题&#xff0c;持续更新。 1. x x 1 VS x 1 辨析下面这两段代码&#xff1a; >>> x y [1, 2, 3, 4] >>> x [4] >>> x [1, 2, 3, 4, 4] >>> y [1, 2, 3, 4, 4]>>> x y …

都在讨论高并发,结果连并发量、TPS、QPS都分不清

“ 年年岁岁跳槽季&#xff0c;回回必问高并发&#xff01;原因很简单&#xff0c;因为高并发能牵扯出太多问题&#xff0c;接口响应超时、CPU负载升高、GC频繁、死锁、大数据量存储等&#xff0c;能考察求职者的真实情况。而很多人在第一步就倒下了&#xff01;因为对数据化的…

哈希表(散列表)基础概念与经典题目(Leetcode题解-Python语言)之中——实际应用

上一节介绍了哈希表的原理与设计方法&#xff0c;这一节则直接python中现有的哈希表类型&#xff1a;哈希集合 set&#xff08;集合&#xff09;和哈希映射 dict&#xff08;字典&#xff09;来解决实际应用&#xff08;刷题&#xff09;。 零、概念 在介绍实际应用之前&#…

leetcode518. 零钱兑换 II

一:题目 二:上码 class Solution { public:/**思路:1.分析题意这个满足答案的结果有很多种&#xff0c;所以我们可以用动态规划去做,那么题意中我们可以知道的是我们是可以输入一种面值的时候,我们是可以重复输入的&#xff0c;那么这就是背包类型中的完全背包了2.动态规划5步…

跟我一起学.NetCore之选项(Options)核心类型简介

前言.NetCore中提供的选项框架&#xff0c;我把其理解为配置组&#xff0c;主要是将服务中可供配置的项提取出来&#xff0c;封装成一个类型&#xff1b;从而服务可根据应用场景进行相关配置项的设置来满足需求&#xff0c;其中使用了依赖注入的形式&#xff0c;使得更加简单、…

哈希表(散列表)基础概念与经典题目(Leetcode题解-Python语言)之下——设计键

在很多应用中&#xff0c;我们会发现某种映射关系&#xff08;模式&#xff09;&#xff0c;但它并不是简单一 一对应的。这时&#xff0c;我们就要从键 key 入手&#xff0c;通过设计合适的键&#xff0c;建立映射关系。leetbook的这个章节总结了一些常见的键&#xff0c;以供…

《ASP.NET Core项目开发实战入门》送书活动结果公布

截至2020.09.20 本次送书活动《ASP.NET Core项目开发实战入门》。下面把Top 5的留言截图给大家回顾一下。以下5位同学将获赠书籍一本&#xff1a;小林子鉴静红脸先生阿星Plus以上同学请在2020年9月25日24&#xff1a;00之前加小二微信领取赠书&#xff0c;超过时间视为放弃。小…

二分查找基础概念与经典题目(Leetcode题解-Python语言)二分索引型

二分查找的定义如下&#xff08;引自Wiki&#xff09;&#xff1a; 在计算机科学中&#xff0c;二分查找算法&#xff08;英语&#xff1a;binary search algorithm&#xff09;&#xff0c;也称折半搜索算法&#xff08;英语&#xff1a;half-interval search algorithm&…

Magicodes.IE 2.3重磅发布——.NET Core开源导入导出库

在2.3这一版本的更新中&#xff0c;我们迎来了众多的使用者、贡献者&#xff0c;在这个里程碑中我们也添加并修复了一些功能。对于新特点的功能我将在下面进行详细的描述&#xff0c;当然也欢迎更多的人可以加入进来&#xff0c;再或者也很期待大家来提issues或者PR&#xff0c…

听说用 C# 写 TensorFlow 更高效?

经过半年呕心沥血的努力&#xff0c;SciSharp STACK终于把Tensorflow .NET绑定升级到可以使用 tensorflow 2.3, 新版本最大的优势是实现了Eager模式, 这个特性是让.NET C#/ F#成为机器学习模型开发工具的重要前置条件。NugGet包下载:https://www.nuget.org/packages/TensorFlow…

leetcode279. 完全平方数

一:题目 二:上码 class Solution { public:/**思路:1.分析题意这个就是将一个数分成几个数的和;然而的话,这几个数必须的是完全平方数,我们要求的是最少数量的完全平方数这个满足答案的有好几个;但是我们要求的是最少的数量2.动态规划五步走1>:确定dp数组的含义以及下标的含…

岛屿类问题的广度优先深度优先双解法(Leetcode题解-Python语言)

695. 岛屿的最大面积 先上最经典的题目&#xff0c;详细思路看这题的官方题解&#xff0c;简单来说的岛屿问题就是遍历二维数组&#xff0c;一般都是从一块陆地开始&#xff0c;进行深度优先或者广度优先搜索&#xff0c;每次上下左右四个方向选其一然后寻找下一块陆地&#x…

跟我一起学.NetCore之Options实例演示及分析

前言来啦&#xff01;来啦&#xff01;上一节一堆代码&#xff0c;是不是感觉甚是无味啊&#xff1f;没关系&#xff0c;这里结合上一节内容专注举例演示&#xff0c;绝不废话&#xff01;走起~~~~~正文老规矩&#xff0c;一个WebApi项目走起&#xff0c;项目结构如下&#xff…