python实现树的深度优先遍历与广度优先遍历详解

yizhihongxing

下面是详细讲解“Python实现树的深度优先遍历与广度优先遍历详解”的完整攻略。

1. 什么是树

树是一种非线性数据结构,它由若干个节点组成,每个节点可以有若干个子节点。树节点之间存在一种层次关系,其中上面的节点称根节点,最下面的节点称为叶子节点。

2. 树的遍历

树的遍历是指按照一定的顺序访问树的所有节点。常见的树的遍历方式有深度优先历和广度优先遍历。

2.1 深度优先遍历

深度优先遍历是指从根节点开始,沿着一条路径一直遍历到叶子节点,然后回溯到上一个节点,再遍历另条路径,直到遍历完整棵树。深度优遍历可以使用递归或栈来现。

以下是一个使用递归实现深优先遍历的示例。

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

def dfs(root):
    if not root:
        return

    print(root.val)
    dfs(root.left)
    dfs(root.right)

# 创建一棵树
root = TreeNode(1)
root.left = TreeNode(2)
root.right = TreeNode(3)
root.left.left = TreeNode(4)
root.left.right = TreeNode(5)

# 深度优先遍历
dfs(root)

输出结果为:

1
2
4
5
3

2.2 广度优先遍历

广度优先遍历是指从根节点开始,按照层次顺序遍历树的所有节点。广度优先遍历可以使用队列来实现。

以下是一个使用队列实现广度优先遍历的示例。

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

def bfs(root):
    if not root:
        return

    queue = [root]
    while queue:
        node = queue.pop(0)
        print(node.val)

        if node.left:
            queue.append(node.left)
        if node.right:
            queue.append(node.right)

# 创建一棵树
root = TreeNode(1)
root.left = TreeNode(2)
root.right = TreeNode(3)
root.left.left = TreeNode(4)
root.left.right = TreeNode(5)

# 广度优先遍历
bfs(root)

输出结果为:

1
2
3
4
5

3. 示例说明

以下是两个示例说明,分别是深度优先遍历和广度优先遍。

3.1 深度优先遍历

以下是一个递归实现深度优先遍历的示例,遍历一棵树。

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

def dfs(root):
    if not root:
        return

    print(root.val)
    dfs(root.left)
    dfs(root.right)

# 创建一棵树
root = TreeNode(1)
root.left = TreeNode(2)
root.right = TreeNode(3)
root.left.left = TreeNode(4)
root.left.right = TreeNode(5)

# 深度优先遍历
dfs(root)

输出结果为:

1
2
4
5
3

3.2 广度优遍

以下是使用队列实现广度优先遍历的示例,遍历一棵树。

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

def bfs(root):
    if not root:
        return

    queue = [root]
    while queue:
        node = queue.pop(0)
        print(node.val)

        if node.left:
            queue.append(node.left)
        if node.right:
            queue.append(node.right)

# 创建一棵树
root = TreeNode(1)
root.left = TreeNode(2)
root.right = TreeNode(3)
root.left.left = TreeNode(4)
root.left.right = TreeNode(5)

# 广度优先遍历
bfs(root)

输出结果为:

1
2
3
4
5

4. 总结

树的遍历是指按照一定的顺序访问树的所有节点。常见的树的遍历方式有深度优先遍历和广度优先遍历。本文介绍了深度优先遍历和广度优先遍历的实现方法,并提供了个示例说明,分别是深度优先遍历和广度优先遍历。

本站文章如无特殊说明,均为本站原创,如若转载,请注明出处:python实现树的深度优先遍历与广度优先遍历详解 - Python技术站

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

相关文章

  • 解决python和pycharm安装gmpy2 出现ERROR的问题

    解决Python和PyCharm安装gmpy2出现ERROR的问题 在使用Python和PyCharm安装gmpy2时,有时会出现ERROR的问题,导致无法正常使用该模块。本文将详细讲解解决Python和PyCharm安装gmpy2出现ERROR的问题的完整攻略,包括安装依赖库使用wheel文件安装等方法。 安装依赖库 在安装gmpy2之前,需要先安装一些赖…

    python 2023年5月13日
    00
  • Python当中的array数组对象实例详解

    Python中的array数组对象实例详解 Python中的array模块提供了一种高效的数组对象,它与Python列表(List)类似,是数组中的元素必须是同一类型。本攻略将介绍如何创建array数组对象、访问数组中的元素、修改数组中的元素、切片数组、连接数组、删除数组、计算数组中元素的个数、查元素在数组中的位置等操作。 创建array数组对象 我们可以使…

    python 2023年5月13日
    00
  • Python:用os重命名文件时如何保留文件扩展名?

    【问题标题】:Python: how to retain the file extension when renaming files with os?Python:用os重命名文件时如何保留文件扩展名? 【发布时间】:2023-04-04 19:30:01 【问题描述】: 假设我有一个文件夹,其中包含 n 个要重命名的 csv 文件。新文件名将类似于ABx…

    Python开发 2023年4月6日
    00
  • python获取文件真实链接的方法,针对于302返回码

    Python 获取文件真实链接的方法,针对于 302 返回码 在爬取网站数据时,有些网站会将文件链接进行加密或者重定向,为了获取文件的真实链接,我们需要对重定向进行处理。以下是 Python 获取文件真实链接的方法,针对于 302 返回码。 使用 requests 模块获取真实链接 使用 requests 模块获取真实链接非常简单,只需要使用 allow_r…

    python 2023年5月15日
    00
  • Python Sqlite3以字典形式返回查询结果的实现方法

    下面是详细的攻略: 概述 Python中使用sqlite3库操作SQLite数据库时,查询结果默认以元组的形式返回。但是,在实际开发中,我们有时候需要以字典的形式返回查询结果,以方便代码的编写和维护。本攻略将介绍如何使用PythonSqlite3以字典形式返回查询结果。 实现方法 下面是具体的实现方法: 开启row_factory 在PythonSqlite…

    python 2023年5月13日
    00
  • 浅谈matplotlib.pyplot与axes的关系

    浅谈matplotlib.pyplot与axes的关系 matplotlib.pyplot和axes的基本概念 在使用matplotlib绘图时,我们通常会导入pyplot模块。这个模块中包含了许多用于绘图的函数。而其中一个最常用的函数就是plot()函数了。然而,plot()函数的实现其实是基于另一个对象:axes对象。 我们可以将axes对象理解为一张画…

    python 2023年5月18日
    00
  • Python中如何处理常见报错

    在Python编程中,我们经常会遇到各种异常报错。这些报错可能是由于代码中的语法错误、数据类型错误、变量或函数未定义、索引超出范围等原因引起的。以下是一些常见Python异常报错及其解决方案: 1. SyntaxError SyntaxError通常是由于代码中语法错误引起的。解决方案是检查代码中的语法错误,并进行修正。 示例1:缺少冒号 # 错误示例 if…

    python 2023年5月13日
    00
  • Ubuntu 20.04最佳配置指南(新手必备)

    Ubuntu 20.04最佳配置指南(新手必备) 如果你是Ubuntu新手,想要将你的系统配置得更好,那么这篇指南是为你准备的。在这篇指南中,我们会介绍如何优化Ubuntu 20.04的配置,以提高其性能和易用性。我们将覆盖以下主题: 更新和升级软件 安装新的软件包和库 配置终端 更改默认设置 安装和使用GNOME Shell扩展 美化桌面 更新和升级软件 …

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