二叉树:深度优先遍历与广度优先遍历(及其Python实现)

2023-10-26

二叉树:深度优先遍历与广度优先遍历(及其Python实现)

本问记录二叉树的深度优先遍历算法和广度优先遍历算法的特点及其python实现。

1 深度优先遍历

深度优先遍历算法包括先序遍历、中序遍历和后续遍历。

1.1 深度优先遍历顺序

我们根据下图只有3个节点的二叉树说明深度优先遍历顺序。
(各节点分别标上序号)
3_node

  1. 先序遍历:0→1→2
  2. 中序遍历:1→0→2
  3. 后序遍历:1→2→0

注意主要差别在于节点0在排序中的位置,节点1和节点2的相对位置是不变的(1在前,2在后)。

一般情况下的二叉树,如下图所示:
(各节点分别标上序号)
在这里插入图片描述
以先序遍历为例:
我们首先从最上面开始看,将0节点的左子树包含的节点当作一个整体(1、3、4、7、8、9),记为整体1;右子树包含的节点也当作一个整体(2、4、6),记为整体2;所以此时,先序遍历顺序为:

  • 0 → 整体1 → 整体2

但是整体1中还包含若干节点,所以继续分析整体1中的节点。
同理,从上往下分析,节点1左子树为一个整体(3、7、8),记为整体3;右子树为一个整体(4、9),记为整体4;所以此实,整体1中的先序遍历顺序为:

  • 1 → 整体3 → 整体4

同理,整体3包含若干节点,需要继续分析整体3(3、7、8)。
此时我们发现节点3左子树只有一个节点7,右子树只有一个节点8,所以整体3的先序遍历顺序为:

  • 3 → 7 → 8

于是,按照这个方法,我们能够推出整个二叉树的先序遍历顺序:

  • 0 → 1 → 3 → 7 → 8 → 4 → 9 → 2 → 5 → 6

同理,我们能推导出另外两种深度优先遍历的遍历顺序:

  1. 先序遍历:0 → 1 → 3 → 7 → 8 → 4 → 9 → 2 → 5 → 6
  2. 中序遍历:7 → 3 → 8 → 1 → 9 → 4 → 0 → 5 → 2 → 6
  3. 后序遍历:7 → 8 → 3 → 9 → 4 → 1 → 5 → 6 → 2 → 0

1.2 深度优先遍历Python实现

根据上述的遍历过程描述,我们可以看出这实际上是一个递归的过程,因此使用递归可以很简单地实现3种深度优先遍历。

首先定义节点和树的类并定义添加节点的方法,之后在二叉树类中定义先序遍历、中序遍历和后序遍历的方法。

# 节点类
class Node(object):
    def __init__(self, item):
        self.elem = item
        self.lchild = None
        self.rchild = None

# 二叉树类
class Tree(object)
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

二叉树:深度优先遍历与广度优先遍历(及其Python实现) 的相关文章

随机推荐

  • gitlab部署及整合Jenkins持续构建(三)nexus私服的安装及实战、linux安装mysql

    文章目录 敏捷持续集成是什么 linux安装jdk和maven 安装jdk 安装maven linux安装nexus3 x nexus私服的使用 编译安装mysql 可能遇到的问题 使用cmake时报错 敏捷持续集成是什么 持续集成是一种软
  • 微信网页如何跟踪调试

    微信从8 0 19开始已经放弃使用X5内核 而使用xweb内核 之前http debugx5 qq com已不可行 新方式如下 1 手机用usb连接至电脑 必须处于usb调试模式 2 在电脑上打开Edge浏览器 地址栏输入如下链接 edge
  • BTC协议

    假如先把去中心化的前提先去掉 我们都信赖一个中心化的机构比如说央行 央行发行货币是由印钞厂那里印钞等等的顺序后才开始发行货币的也就是我们以前最常见的纸币等 而想一下央行要是不发行实物货币了转为发行虚拟货币 央行的公钥我们是都知道的 而我在和
  • 项目时间管理作业

    1 练习题六 1 双代号网络图 2 路径1 A D G J K 长度 2 4 6 1 2 15 路径2 A B E I J K 长度 2 2 2 5 1 2 14 路径3 A B E H K 长度 2 2 2 2 2 10 路径4 A C
  • 原码和补码在计算机中的应用,原码,补码和反码在计算机中的作用

    满意答案 xxyy5566123 2013 06 26 采纳率 58 等级 12 已帮助 13466人 引入原码 反码 和补码的目的就是为了解决减法问题 因为计算机CPU的运算器中只有加法器 要把减法转化成加法来计算 举个例子 A表示十进制
  • 【面试系列】反转链表II

    题意 原题链接 思路 先找到 L R L R L R 由于我们是翻转区间 L R
  • eclipse 下面的folder,source folder,package的区别与作用

    首先明确一点 folder source folder package都是文件夹 既然是文件夹 那么任何的文件都可以往这三种文件夹下面的放 1 他们的区别 folder就是普通的文件夹 它和我们window下面使用的文件夹没有任何区别 so
  • Java 面试知识点合集

    一 基础篇 1 1 java基础 1 面向对象的特征 封装 继承 多态 1 封装 属性能够描述事物的特征 方法能够描述事物的动作 封装就是把同一类事物的共性 包括属性和方法 归到同一类中 方便使用 封装的好处有 隐藏数据及实现细节 对每个属
  • web_servlet总结

    1 Web流程 1 1软件架构 1 C S 客户端 服务器端 cs架构建立在专用的网络上 一般面向相对固定的用户群 它可以对权限进行多层次校验 提供了更安全的存取模式 对信息安全的控制能力很强 2 B S 浏览器 服务器端 bs架构建立在广
  • 服务器千兆网络显示10,win10系统如何查看网卡是千兆还是百兆

    现在的很多新主板配备的都是千兆网络接口 可以更好的满足大宽带用户需求 但是对于win10系统用户来说 并不知道要如何查看网卡是千兆还是百兆 其实方法很简单 现在给大家分享一下win10系统查看网卡是千兆还是百兆的具体解决方法 方法一 1 在
  • 【 ST-LINK\ ST-LINK Utility下载,烧录,批处理操作\命令行】

    必看 必看 必看 下面概述了以下几个烧录软件下载安装 写程器接线 批处理操作内容较多耐心看完 J Falsh 可以称得上目前主流 能烧录目前80 主流芯片 STM32 ST LINK Utility ST系列芯片烧录超方便 ST系列 ST全
  • uview u-input 点击清除按钮,数据清空但视图未清空

    问题描述 点击 uview 的 u input 输入框自带的清除按钮 v model 绑定的数据清空了 但是输入框内还显示着之前的数据 解决方案 将 v model 绑定的值写到 data 初始变量中声明 原始代码
  • pandas的Excel文件读写(一)——组件要求与文件读取

    一 组件要求 实现pandas的Excel文件读写 除了安装pandas外 还需要安装下列组件 1 xlrd 从指定的xls格式文件中读取数据 2 xlwt 写入数据到指定的xls格式文件 3 openpyxl 支持xlsx格式文件的读写
  • 视频下载算法分析

    import random import re import time import requests from Crypto Cipher import AES from Crypto Util Padding import pad fr
  • centos7最小化安装发现没ifconfig命令解决方法

    1 安装的最小化版mini没有ifconfig这个命令 解决方法 yum y install net tools 出现图中错误 怀疑系统还不能上网导致 尝试ping114 114 114 114 如下图 果然不能ping通 的确是网络不通
  • CausalEGM安装使用

    1代码来源 github https github com SUwonglab CausalEGM tree main src pip Tutorial for Python Users CausalEGM documentation 安装
  • 2022.6.27小记

    1 不同页面件间锚点跳转 vue实现不同页面间锚点跳转 半塘潮汐的博客 CSDN博客 不同页面使用锚点 2 vue监听页面滚动距离 mounted window addEventListener scroll this handleScro
  • 玩转Mixly – 3、Arduino AVR编程 之 控制

    以下内容源自Mixly官方技术文档 https mixly readthedocs io zh CN latest Arduino AVR 02Control html 控制 控制类别中包括了时间延迟 条件执行 循环执行 获取运行时间 初始
  • java初中级面试题(SSM+Mysql+微服务(SpringCloud+Dubbo)+消息队列(RocketMQ)+缓存(Redis+MongoDB)+设计模式+搜索引擎(ES)+JVM

    目录 基础篇 一 Get 和 Post 的区别 二 Java 多态的具体体现 三 StringBuffer StringBuilder String 区别 四 和 equals 区别 五 重写 equals 需要重写 hashCode 吗
  • 二叉树:深度优先遍历与广度优先遍历(及其Python实现)

    二叉树 深度优先遍历与广度优先遍历 及其Python实现 本问记录二叉树的深度优先遍历算法和广度优先遍历算法的特点及其python实现 1 深度优先遍历 深度优先遍历算法包括先序遍历 中序遍历和后续遍历 1 1 深度优先遍历顺序 我们根据下