📅  最后修改于: 2023-12-03 15:19:34.180000             🧑  作者: Mango
树结构是一种非常经典的数据结构,能够很好地表示层次化的关系。而树的遍历算法是树的基本操作之一,也是面试中常常出现的问题。
在Python中,树的遍历有三种类型:前序遍历、中序遍历和后序遍历。下面我们将详细介绍这三种遍历算法。
前序遍历,也称为先序遍历,是以根节点->左子树->右子树的顺序访问二叉树节点的遍历方式。具体实现方法如下:
def preorder_traversal(root):
if not root:
return []
res = []
stack = [root]
while stack:
node = stack.pop()
res.append(node.val)
if node.right:
stack.append(node.right)
if node.left:
stack.append(node.left)
return res
其中,root
表示树的根节点。首先判断树是否为空,若为空则直接返回空列表。否则,定义一个列表res
和一个栈stack
,将根节点压入栈中。进入while循环,每次从栈中取出一个节点node
,将节点的值添加到res
中,并按照右子树->左子树的顺序依次压入栈中。最终返回列表res
,即为前序遍历的结果。
中序遍历是以左子树->根节点->右子树的顺序访问二叉树节点的遍历方式。具体实现方法如下:
def inorder_traversal(root):
if not root:
return []
res = []
stack = []
node = root
while node or stack:
while node:
stack.append(node)
node = node.left
node = stack.pop()
res.append(node.val)
node = node.right
return res
同样,首先判断树是否为空。定义一个列表res
和一个栈stack
,将根节点赋给临时变量node
。进入while循环,先将node
和所有左子树节点按照左子树->根节点的顺序压入栈中,直到node
为空。此时弹出栈顶的节点,将节点的值添加到res
中,并将右子树节点赋给node
。再次进入while循环,如此往复,直到所有节点都被访问完毕。最终返回列表res
,即为中序遍历的结果。
后序遍历是以左子树->右子树->根节点的顺序访问二叉树节点的遍历方式。具体实现方法如下:
def postorder_traversal(root):
if not root:
return []
res = []
stack = [root]
while stack:
node = stack.pop()
res.append(node.val)
if node.left:
stack.append(node.left)
if node.right:
stack.append(node.right)
return res[::-1]
同样的,首先判断树是否为空。定义一个列表res
和一个栈stack
,将根节点压入栈中。进入while循环,每次从栈中取出一个节点node
,将节点的值添加到res
中,并按照左子树->右子树的顺序依次压入栈中。最后返回列表res
的逆序,即为后序遍历的结果。
以上是Python中树的三种遍历算法的具体实现方法。此外,还可以使用递归的方式实现遍历,但相对而言较为简单,不再赘述。
无论是哪种方法,选择适合特定场景的遍历方法可以大大提高算法效率。在实际开发中,我们需要根据具体情况选取最优解。