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

如何使用Python函数进行二叉树遍历?

发布时间:2023-06-25 11:01:03

在Python中,可以使用递归函数或迭代函数进行二叉树的遍历。二叉树遍历分为前序遍历、中序遍历和后序遍历。在遍历过程中,对结点的值进行操作或打印输出。

1. 递归二叉树遍历函数

递归函数是比较直观且易于理解的方法,其优点是代码简洁,并且易于实现。在递归函数中,分别对二叉树的左子树和右子树进行递归操作,直至遍历完整棵树。

前序遍历函数代码如下所示:

def preorderTraversal(self, root: Optional[TreeNode]) -> List[int]:
    res = []
    self.preorder(root, res)
    return res

def preorder(self, root, res):
    if not root:
        return
    res.append(root.val)
    self.preorder(root.left, res)
    self.preorder(root.right, res)

中序遍历函数代码如下所示:

def inorderTraversal(self, root: Optional[TreeNode]) -> List[int]:
    res = []
    self.inorder(root, res)
    return res

def inorder(self, root, res):
    if not root:
        return
    self.inorder(root.left, res)
    res.append(root.val)
    self.inorder(root.right, res)

后序遍历函数代码如下所示:

def postorderTraversal(self, root: Optional[TreeNode]) -> List[int]:
    res = []
    self.postorder(root, res)
    return res

def postorder(self, root, res):
    if not root:
        return
    self.postorder(root.left, res)
    self.postorder(root.right, res)
    res.append(root.val)

2. 迭代二叉树遍历函数

迭代函数是利用栈的数据结构,模拟递归函数的过程,也可以实现二叉树的遍历。在迭代函数中,使用一个栈来存储待遍历的结点。初始时,将根节点入栈。当栈不为空时,弹出栈顶结点,并对其进行遍历操作,然后将其右子树和左子树依次入栈。

前序遍历函数代码如下所示:

def preorderTraversal(self, root: Optional[TreeNode]) -> List[int]:
    res, stack = [], [root]
    while stack:
        node = stack.pop()
        if node:
            res.append(node.val)
            stack.append(node.right)
            stack.append(node.left)
    return res

中序遍历函数代码如下所示:

def inorderTraversal(self, root: Optional[TreeNode]) -> List[int]:
    res, stack = [], []
    while stack or root:
        while root:
            stack.append(root)
            root = root.left
        root = stack.pop()
        res.append(root.val)
        root = root.right
    return res

后序遍历函数代码如下所示:

def postorderTraversal(self, root: Optional[TreeNode]) -> List[int]:
    res, stack = [], [root]
    while stack:
        node = stack.pop()
        if node:
            stack.append(node.left)
            stack.append(node.right)
            res.append(node.val)
    return res[::-1]

在使用这些函数进行二叉树遍历时,需要注意的是,在使用递归函数进行遍历时,需要手动创建存储遍历结果的列表;而在使用迭代函数进行遍历时,需要使用辅助栈来存储待遍历的结点。此外,每个结点需要被访问两次以确保正确性。也就是,在访问该结点之前,需要先访问其左子树和右子树。