函数inordertraverse实现二叉树的中序遍历,二叉树的中序遍历举例
本文主要总结了二叉树的三种遍历方法以及相关leetcode算法问题的解决方法。
线性数据结构(矩阵、列表、队列、栈))不同,树遍历可以有不同的遍历方式。
先序遍历
电缆敷设流程如下。访问根节点、当前节点的左子树和当前节点的右子树。顺序扫描的应用场景主要是复制树。在树上,第一次扫描的顺序是1 2 4 5 3。
让我们简单地递归实现它:
defprintpreorder(root):if root:print(root . val),print preorder(root . left)print preorder(root . rt . right)
访问左侧子树、根节点和右侧子树。依次遍历的应用场景主要位于二叉查找树。这是因为返回的节点值会增加。通过使继电器导体变形,也可以恢复降低的BST值。在上面的例子中,顺序扫描的顺序应该是42513。
efprintinorder(root ) : if root:按顺序打印(root.left ) print)、按顺序打印(root.right))
94 . binarytreeinorderoversal(https://李特code-cn.com/problems/binary-tree-in顺序遍历/)
通过堆叠来实现:
efinordertraversal(root):RES=[]node _ stack=[]p=rootwhilepornode _ stack 3360 while p:stack . append)))p=p . left cur _ node=node _ stack。)
95.binary search tree iterator(https://LEET code-cn . com/problems/binary-search-tree-iterator/),解决这个问题的方法其实就是使用stack。
因为主题是相关的,所以这里简单提到迭代器的概念:
迭代是Python最强大的功能之一,它是访问集合元素的一种方式。
迭代器是一个可以记住导线测量位置的对象。
迭代器对象从集合中的第一个元素开始访问,直到所有元素都被访问。迭代器不能向前递减。
迭代器有两个基本方法:iter(和next)。
您可以使用字符串、列表或元组对象创建迭代器。
有关详细的定义和示例,请参见https://www . run OOB.com/python3/python3- iterator-generator.html。
中序遍历
电缆敷设流程如下。访问左边的子树、右边的子树和根节点。遍历可以用来删除树。上面的例子是按照下面的顺序遍历。正确的顺序是4 5 2 3 1。
defprintpostorder(root):if root:print post order(root)root . val)root . left(print post order)root(rt)
binarytreepostordertraversal(https://利特code-cn.com/problems/binary-tree-postorder-traversal/)
解决方法如下。defpostordertraversal(root):if not root 3360 return[]RES=[]node _ stack=[root]while node _ stack 3360 node)if node . left:node _ stack . append(node . left)if node . right 3360 node _ stack . append(node . right)RES . append
在树的深度优先遍历(包括前、中、后遍历)中,递归是最直观、最容易理解的,但考虑到效率,通常不建议使用递归。
堆栈法虽然可以提高效率,但是其嵌套循环非常热,难以理解,容易造成“一看就知道,一写就报废”的窘境。另外,循环结构根据扫描顺序(前序、中序、后序)变化很大,增加了记忆负担。
因此,结合堆栈迭代法的效率,我们将介绍“颜色标记法()”,它和递归法一样简单易懂。此外,这种方法可以为前面序列、中间序列和后面序列的迭代写出完全一致的代码。
其核心思想如下
用颜色来标记节点的状态。新节点是白色的,被访问的节点是灰色的。
如果发现一个白色节点,用灰色标记,然后按照右子节点、自身、左子节点的顺序堆叠。
如果检测到的节点为灰色,则输出节点值。
该方法实现的中序扫描如下:为了实现前后遍历,只需要调整左右子节点的栈序。
类解决方案3360 defineorderstraversal(self,root: TreeNode )- List[int]: WHITE,gray=0,1 RES=[]stack=[node=stack。pop)ifnodeisnone:如果color==WHITE 3360堆栈则继续。追加))白色3360栈。追加))652非节点))栈。append))白色,节点。left()(else:RES . append)节点val)将原始链接附加到返回决议.https://李特code-cn.com/problems/binary-tree-inor里因