二叉树三种遍历方式的递归和非递归写法(python 实现)
程序员文章站
2024-03-18 13:13:52
...
二叉树的遍历方式
二叉树的遍历有前序,中序和后序三种遍历方式。
前序遍历
前序遍历是指,对于树中的任意节点来说,先打印这个节点,然后再打印它的左子树,最后打印它的右子树。
递归写法
def preorder(root):
if not root:
return
else:
#todo
preorder(root.left)
preorder(root.right)
非递归写法
def preorder(root):
node, stack = root,[]
while node or stack:
while node:
stack.append(node)
#这是第一次遇见它,所以直接进行操作
#todo
node = node.left
node = stack.pop()
node = node.right
中序遍历
中序遍历是指,对于树中的任意节点来说,先打印它的左子树,然后再打印它本身,最后打印它的右子树。
递归写法
def inorder(root):
if not root:
return
else:
inorder(root.left)
#todo
inorder(root.right)
非递归写法
def inorder(root):
node,stack = root,[]
while node or stack:
while node:
stack.append(node)
node = node.left
node = stack.pop()
#这是第二次遇见这个节点
#todo
node = node.right
后序遍历
后序遍历是指,对于树中的任意节点来说,先打印它的左子树,然后再打印它的右子树,最后打印这个节点本身。
递归写法
def postorder(root):
if not root:
return
else:
postorder(root.left)
postorder(root.right)
#todo
非递归写法
def postorder(root):
node, stack = root,[]
while node or stack:
while node:
#todo 这里要和前序遍历是反向操作
#!!!!!!!!!!!!
stack.append(node)
node = node.right
node = stack.pop()
node = node.left
相关解释
二叉树三种遍历顺序的遍历路径是一样的。
但是前序遍历在第一次遇到节点的时候就访问,中序遍历则是第二次访问到该节点的时候进行访问,后序遍历则是第三次访问到该节点才进行实际的访问。
所以 在我们的非递归代码中,先序遍历第一次遇到就马上操作,中序遍历则是在栈弹出之后进行操作,而
后序遍历,后序遍历和前序遍历是对称的。
为了方便理解,贴一下leetcode前序遍历和后序遍历的代码,分别对应leetcode 144题和145题。
前序遍历题解:
class Solution:
def preorderTraversal(self, root: TreeNode) -> List[int]:
node, stack, res = root, [],[]
while node or stack:
while node:
res.append(node.val)
stack.append(node)
node = node.left
node = stack.pop()
node = node.right
return res
后序遍历题解:
class Solution:
def postorderTraversal(self, root: TreeNode) -> List[int]:
node, stack, res = root, [],[]
while node or stack:
while node:
stack.append(node)
res.insert(0,node.val)
node = node.right
node = stack.pop()
node = node.left
return res
请大家通过代码体会前序遍历和后序遍历是对称的的意思。
推荐阅读
-
二叉树三种遍历方式的递归和非递归写法(python 实现)
-
JAVA实现遍历文件夹下的所有文件(递归调用和非递归调用)
-
二叉树遍历的递归、非递归方法(前序、中序、后序,层序)——Java实现
-
图的邻接矩阵、邻接表遍历(python实现)(递归与非递归)(dfs bfs)
-
Java实现的二叉树常用操作【前序建树,前中后递归非递归遍历及层序遍历】
-
Java实现的二叉树常用操作【前序建树,前中后递归非递归遍历及层序遍历】
-
JavaScript实现多叉树的递归遍历和非递归遍历算法操作示例
-
java栈实现二叉树的非递归遍历的示例代码
-
左神算法:分别用递归和非递归方式实现二叉树先序、中序和后序遍历(Java版)
-
C++ 非递归实现二叉树的前中后序遍历