Python实现二叉树的常见遍历操作总结【7种方法】

下面是详细讲解“Python实现二叉树的常见遍历操作总结【7种方法】”的完整攻略。

1. 什么是二叉树

二叉树是一种树形结构,每个节点最多有两个子节点。二叉树的遍历是指按照一定的顺序访问二叉树中的所有节点。

2. 二叉树的遍历方法

以下是二叉树的七种遍历方法,包括前序遍历、中序遍历、后序遍历、层次遍历、Morris遍历、递归遍历和迭代遍历。

2.1 前序遍历

前序遍历是指先访问根节点,然后访问左子树,最后访问右子树。以下是一个前序遍历的示例。

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

def preorderTraversal(root: TreeNode) -> List[int]:
    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

2.2 中序遍历

中序遍历是指先访问左子树,然后访问根节点,最后访问右子树。以下是一个中序遍历的示例。

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

2.3 后序遍历

后序遍历是指先访问左子树,然后访问右子树,最后访问根节点。以下是一个后序遍历的示例。

def postorderTraversal(root: TreeNode) -> List[int]:
    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]

2.4 层次遍历

层次遍历是指按照从上到下、从左到右的顺序访问二叉树中的所有节点。以下是一个层次遍历的示例。

def levelOrder(root: TreeNode) -> List[List[int]]:
    if not root:
        return []
    res = []
    queue = [root]
    while queue:
        level = []
        for _ in range(len(queue)):
            node = queue.pop(0)
            level.append(node.val)
            if node.left:
                queue.append(node.left)
            if node.right:
                queue.append(node.right)
        res.append(level)
    return res

2.5 Morris遍历

Morris遍历是一种不需要使用栈或队列的遍历方法,它利用了线索二叉树的思想。以下是一个Morris遍历的示例。

def morrisTraversal(root: TreeNode) -> List[int]:
    if not root:
        return []
    res = []
    cur = root
    while cur:
        if not cur.left:
            res.append(cur.val)
            cur = cur.right
        else:
            pre = cur.left
            while pre.right and pre.right != cur:
                pre = pre.right
            if not pre.right:
                pre.right = cur
                res.append(cur.val)
                cur = cur.left
            else:
                pre.right = None
                cur = cur.right
    return res

2.6 递归遍历

递归遍历是指使用递归函数遍历二叉树中的所有节点。以下是一个递归遍历的示例。

def preorderTraversal(root: TreeNode) -> List[int]:
    if not root:
        return []
    return [root.val] + preorderTraversal(root.left) + preorderTraversal(root.right)

def inorderTraversal(root: TreeNode) -> List[int]:
    if not root:
        return []
    return inorderTraversal(root.left) + [root.val] + inorderTraversal(root.right)

def postorderTraversal(root: TreeNode) -> List[int]:
    if not root:
        return []
    return postorderTraversal(root.left) + postorderTraversal(root.right) + [root.val]

2.7 迭代遍历

迭代遍历是指使用栈或队列遍历二叉树中的所有节点。以下是一个迭代遍历的示例。

def preorderTraversal(root: TreeNode) -> List[int]:
    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

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

def postorderTraversal(root: TreeNode) -> List[int]:
    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]

3. 示例说明

以下是两个示例说明,分别是前序遍历和中序遍历。

3.1 前序遍历

以下是一个前序遍历的示例,使用迭代方法遍历二叉树中的所有节点。

root = TreeNode(1)
root.left = TreeNode(2)
root.right = TreeNode(3)
root.left.left = TreeNode(4)
root.left.right = TreeNode(5)
print(preorderTraversal(root))  # [1, 2, 4, 5, 3]

3.2 中序遍历

以下是一个中序遍历的示例,使用迭代方法遍历二叉树中的所有节点。

root = TreeNode(1)
root.left = TreeNode(2)
root.right = TreeNode(3)
root.left.left = TreeNode(4)
root.left.right = TreeNode(5)
print(inorderTraversal(root))  # [4, 2, 5, 1, 3]

4. 总结

二叉树的遍历是指按照一定的顺序访问二叉树中的所有节点。Python中可以使用递归、迭代、Morris等方法遍历二叉树。本文介绍了二叉树的七种遍历方法,包括前序遍历、中序遍历、后序遍历、层次遍历、Morris遍历、递归遍历和迭代遍历,并提供了相应的示例。

本站文章如无特殊说明,均为本站原创,如若转载,请注明出处:Python实现二叉树的常见遍历操作总结【7种方法】 - Python技术站

(0)
上一篇 2023年5月14日
下一篇 2023年5月14日

相关文章

  • Python实现爬虫设置代理IP和伪装成浏览器的方法分享

    Python实现爬虫设置代理IP和伪装成浏览器的方法分享 为什么需要设置代理和伪装? 在实现爬虫时,设置代理和伪装成浏览器可以帮助我们做以下事情: 避免被服务器禁止访问,尤其是针对同一IP地址进行频繁访问的情况 隐藏真实IP地址,确保隐私安全 伪装成浏览器,方便数据的获取和解析,避免反爬虫机制的拦截 如何设置代理和伪装成浏览器? 设置代理 Python实现爬…

    python 2023年6月3日
    00
  • python如何实现视频转代码视频

    视频转代码是指将视频中的内容转换为对应的代码。Python中有一些工具和库可以实现这个目标。下面是实现视频转代码视频的完整攻略: 1. 使用OpenCV解析视频 OpenCV是一个计算机视觉库,可以用于读取视频、并从视频中提取图像。以下是使用OpenCV读取视频的代码示例: import cv2 # 打开视频文件 cap = cv2.VideoCapture…

    python 2023年6月2日
    00
  • python实现图像随机裁剪的示例代码

    接下来我将为您详细讲解 “Python实现图像随机裁剪的示例代码” 的完整攻略。 1. 引入必要的库 首先,需要引入 Pillow 库来读取和处理图像,以及 random 库来生成随机数。可以使用 pip 安装 Pillow 库: pip install Pillow 在 Python 代码中引入相关库: from PIL import Image impo…

    python 2023年6月3日
    00
  • Python中的numpy.char.multiply()函数

    numpy.char.multiply()函数用于将每个元素重复n次,以形成一个新的字符串数组,其中n是指定的重复次数。 函数语法如下: numpy.char.multiply(arr, repeats) 其中:- arr: 原始字符串数组。- repeats: 每个元素重复几次。 返回值:返回字符串数组。 下面我们通过两个实例来更为详细的了解numpy.c…

    python-answer 2023年3月25日
    00
  • Python实现的银行系统模拟程序完整案例

    下面我将为您详细讲解”Python实现的银行系统模拟程序完整案例”的完整攻略。 一、需求分析 首先,我们需要明确“Python实现的银行系统模拟程序”的功能需求,主要包括以下几点:1. 用户可以开户,并在开户时设置账户密码,开户时需要输入用户名、身份证号、手机号等信息;2. 用户可以进行存款、取款、转账;3. 用户可以查询余额、账户流水等信息;4. 管理员可…

    python 2023年5月19日
    00
  • 使用Python操作PDF文件

    请看下面的完整攻略。 使用Python操作PDF文件的完整攻略 1. 安装依赖库 在Python中,我们可以使用第三方库来读、写或处理PDF文件。比如PyPDF2、PDFMiner等。在使用前,你需要先安装对应的依赖库。 比如安装PyPDF2: pip install PyPDF2 2. 读取PDF文件 读取PDF文件是处理PDF文件的基础,常见的API是使…

    python 2023年6月5日
    00
  • 分享python机器学习中应用所产生的聚类数据集方法

    下面我来详细讲解如何分享Python机器学习中应用所产生的聚类数据集方法。 背景 在Python机器学习中,聚类(cluster)是基本的无监督学习方法之一。其目的是将它们分为不同的组,使得组内的数据点更加相似,而其间的相异性则最小化。在聚类分析的过程中,我们需要让机器自动学习数据间的相似性,因此我们需要提供一些已经分好类的数据,作为聚类算法的输入。 在这里…

    python 2023年5月14日
    00
  • Python3的介绍、安装和命令行的认识(推荐)

    以下是关于“Python3的介绍、安装和命令行的认识(推荐)”的完整攻略: Python3的介绍 Python 是一种高级编程语言,它简单易学、功能强大、可扩性强被广泛应用于 Web 开发、数据分析、人工智能等领域。Python3 是 Python 语言的最新,它与 Python 相比,有许多改进和优化,如更好的 Unicode 支持、更好的异步 I/O 支…

    python 2023年5月13日
    00
合作推广
合作推广
分享本页
返回顶部