深度优先遍历和广度优先遍历二叉树的实现方法

news/2024/6/29 11:50:03 标签: 深度优先, 宽度优先, 算法

二叉树是一种非常重要的数据结构,在计算机科学中得到广泛的应用。二叉树是一种树形结构,其中每个节点最多有两个子节点,分别称为左子节点和右子节点。在这篇文章中,我们将探讨二叉树的广度优先遍历和深度优先遍历。

广度优先遍历

广度优先遍历是指按照层级顺序逐层遍历二叉树。从二叉树的根节点开始,逐层遍历每个节点。对于每一层,我们先遍历左子节点,再遍历右子节点。这种遍历方式通常使用队列来实现。

以下是一个二叉树的示例:

      1
     / \
    2   3
   / \   \
  4   5   6

广度优先遍历的顺序为:1, 2, 3, 4, 5, 6。遍历过程如下:

  1. 将根节点1入队。
  2. 从队列中取出1并输出。
  3. 将1的左子节点2和右子节点3入队。
  4. 从队列中取出2并输出。
  5. 将2的左子节点4和右子节点5入队。
  6. 从队列中取出3并输出。
  7. 将3的右子节点6入队。
  8. 从队列中取出4并输出。
  9. 从队列中取出5并输出。
  10. 从队列中取出6并输出。

深度优先遍历

深度优先遍历是指以深度优先的方式遍历二叉树。从根节点开始,先遍历左子节点,然后遍历右子节点,直到遍历到叶子节点为止。然后返回上一级节点,继续遍历其右子节点。

以下是同一个二叉树的深度优先遍历示例:

      1
     / \
    2   3
   / \   \
  4   5   6

深度优先遍历的顺序为:1, 2, 4, 5, 3, 6。遍历过程如下:

  1. 访问根节点1。
  2. 遍历左子节点2,访问节点2。
  3. 遍历左子节点4,访问节点4。
  4. 返回上一级节点2,遍历右子节点5,访问节点5。
  5. 返回上一级节点1,遍历右子节点3,访问节点3。
  6. 遍历右子节点6,访问节点6。

深度优先遍历有三种不同的方式:先序遍历、中序遍历和后序遍历。先序遍历指先遍历访问根节点,然后遍历左子树,最后遍历右子树;中序遍历指先遍历左子树,然后访问根节点,最后遍历右子树;后序遍历指先遍历左子树,然后遍历右子树,最后访问根节点。
下面我们分别来看一下这三种深度优先遍历的实现。

先序遍历

先序遍历的遍历顺序是:根节点 -> 左子树 -> 右子树。

以下是先序遍历的递归实现:

def pre_order_traversal(root):
    if root:
        print(root.val)
        pre_order_traversal(root.left)
        pre_order_traversal(root.right)

以下是先序遍历的迭代实现:

def pre_order_traversal(root):
    stack = [root]
    while stack:
        node = stack.pop()
        if node:
            print(node.val)
            stack.append(node.right)
            stack.append(node.left)

中序遍历

中序遍历的遍历顺序是:左子树 -> 根节点 -> 右子树。

以下是中序遍历的递归实现:

def in_order_traversal(root):
    if root:
        in_order_traversal(root.left)
        print(root.val)
        in_order_traversal(root.right)

以下是中序遍历的迭代实现:

def in_order_traversal(root):
    stack = []
    node = root
    while node or stack:
        while node:
            stack.append(node)
            node = node.left
        node = stack.pop()
        print(node.val)
        node = node.right

后序遍历

后序遍历的遍历顺序是:左子树 -> 右子树 -> 根节点。

以下是后序遍历的递归实现:

def post_order_traversal(root):
    if root:
        post_order_traversal(root.left)
        post_order_traversal(root.right)
        print(root.val)

以下是后序遍历的迭代实现:

def post_order_traversal(root):
    stack = [(root, False)]
    while stack:
        node, visited = stack.pop()
        if node:
            if visited:
                print(node.val)
            else:
                stack.append((node, True))
                stack.append((node.right, False))
                stack.append((node.left, False))

怎么样理解了么 有问题评论区交流ha


http://www.niftyadmin.cn/n/185299.html

相关文章

Ubuntu20.04LTS安装CUDA并支持多版本切换

文章目录1.前置知识2.查看显卡驱动版本号3.查看显卡驱动版本号和CUDA版本对应关系4.查看经典的CUDA版本号5.安装CUDA5.1.下载CUDA安装包5.2.执行CUDA安装5.3.配置环境变量5.4.CUDA多版本管理1.前置知识 如果Ubuntu系统还没有安装显卡驱动,参考这篇文章:…

智慧水务一体化监管平台,数字化,可视化,智慧化管理

平台概述 智慧水务一体化监管平台是以物联感知技术、大数据、智能控制、云计算、人工智能、数字孪生、AI算法、虚拟现实技术为核心,以监测仪表、通讯网络、数据库系统、数据中台、模型软件、前台展示、智慧运维等产品体系为支撑,以城市水资源、水生态、…

组件、套件、 中间件、插件

组件、套件、 中间件、插件 组件 位于框架最底层,是由重复的代码提取出来合并而成。组件的本质,是一件产品,独立性很强,组件的核心,是复用,与其它功能又有强依赖关系。 模块 在中台产品和非中台产品中&…

英语狂飙-第五天-2023.03.31

文章目录问题chatGPT回答我的尝试单词句型表达总结问题 练习英语口语第五天,表达时使用rambling方式,但遇到想描述的事物,脑子里没有单词和句型,或者句型非常单一,怎么办? chatGPT回答 很多人在学习英语…

【从零开始学习 UVM】3.5、UVM TestBench架构 —— UVM Sequencer [uvm_sequencer]

文章目录 Usage(用法)Custom Sequencer(自定义sequencer)Class Hierarchy一个 sequencer 生成数据事务作为类对象并将其发送到driver以执行。建议扩展uvm_sequencer基类,因为它包含了允许sequence与driver通信所需的所有功能。基类是由可以被sequencer处理的requset和resp…

加多宝二次创业五周年:解锁品牌持续增长密码

今年作为后疫情时代元年,首要的任务是提振经济、重振信心,其中消费市场的提振至关重要。 春江水暖鸭先知。每当消费市场开始复苏,食品饮料行业的回暖一般会更明显。而要扩大食品饮料的消费规模、提振消费信心,关键在于品牌结合外…

熟练Redis之无处不在的锁

为了保证并发访问的正确性,Redis提供了两种方法,分别是加锁和原子操作 Redis加锁两个问题:一个是,如果加锁操作多,会降低系统的并发访问性能;第二个是,Redis客户端要加锁时,需要用到分布式锁,而分布式锁实…

68个Python内置函数

68个Python内置函数4.27内置函数68个Python内置函数,建议你吃透!**和数字相关****和数据结构相关****和作用域相关****和迭代器生成器相关****字符串类型代码的执行****输入输出****内存相关****文件操作相关****模块相关****帮 助****调用相关****查看内…