欢迎访问宙启技术站
智能推送

实现Python中的二叉树遍历函数:前序、中序和后序遍历

发布时间:2023-07-20 07:06:05

在实现二叉树的遍历函数之前,首先我们需要先定义二叉树的数据结构。

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

其中,val 表示节点的值,left 和 right 分别表示左子树和右子树。

接下来,我们可以实现三种遍历函数:前序遍历、中序遍历和后序遍历。

1. 前序遍历

前序遍历按照「根节点 -> 左子树 -> 右子树」的顺序遍历二叉树。具体实现如下:

def preorderTraversal(root):
    if not root:
        return []
    stack = [root]
    res = []
    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

在这里,我们使用一个栈来辅助遍历。首先将根节点添加到栈中,然后不断弹出栈顶节点,并将其值添加到结果列表中。接着按照右子节点先入栈的顺序将右子节点和左子节点分别入栈,以保证下一个弹出的节点是左子树的根节点。

2. 中序遍历

中序遍历按照「左子树 -> 根节点 -> 右子树」的顺序遍历二叉树。具体实现如下:

def inorderTraversal(root):
    stack = []
    res = []
    node = root
    while stack or node:
        while node:
            stack.append(node)
            node = node.left
        node = stack.pop()
        res.append(node.val)
        node = node.right
    return res

同样地,我们使用一个栈来辅助遍历。首先将根节点入栈,并将其左子树的所有左节点依次入栈。然后不断弹出栈顶节点,并添加到结果列表中,接着将弹出节点的右子树节点入栈。

3. 后序遍历

后序遍历按照「左子树 -> 右子树 -> 根节点」的顺序遍历二叉树。具体实现如下:

def postorderTraversal(root):
    stack = []
    res = []
    prev = None
    while stack or root:
        while root:
            stack.append(root)
            root = root.left
        root = stack[-1]
        if not root.right or root.right == prev:
            root = stack.pop()
            res.append(root.val)
            prev = root
            root = None
        else:
            root = root.right
    return res

同样地,我们使用一个栈来辅助遍历。首先将根节点入栈,并将其左子树的所有左节点依次入栈。然后判断栈顶节点的右子树是否为空或已经遍历过,如果是则将栈顶节点弹出,并添加到结果列表中;如果不是则将右子树节点入栈。

以上就是实现二叉树前序、中序和后序遍历的函数。