📜  Python树遍历算法(1)

📅  最后修改于: 2023-12-03 15:19:34.180000             🧑  作者: Mango

Python树遍历算法

树结构是一种非常经典的数据结构,能够很好地表示层次化的关系。而树的遍历算法是树的基本操作之一,也是面试中常常出现的问题。

在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中树的三种遍历算法的具体实现方法。此外,还可以使用递归的方式实现遍历,但相对而言较为简单,不再赘述。

无论是哪种方法,选择适合特定场景的遍历方法可以大大提高算法效率。在实际开发中,我们需要根据具体情况选取最优解。