数据结构——树和森林的遍历方法

2023-05-16

树的遍历

1、树的遍历的定义:以某种方式访问树中的每一个结点,且仅访问一次。 树的遍历主要有先根遍历和后根遍历。
2、(1)先根遍历:若树非空,则先访问根结点,再按照从左到右的顺序遍历根结点的每一棵子树。这个访问顺序与这棵树对应的二叉树的先序遍历顺序相同。
(2)后根遍历:若树非空,则按照从左到右的顺序遍历根结点的每一棵子树,之后再访问根结点。其访问顺序与这棵树对应的二叉树的中序遍历顺序相同。
Example one:

例子1
根据以上这幅图有如下结果:
树的先根遍历:A-B-E-F-G-C-H-D-I-J
对应的二叉树的先序遍历:A-B-E-F-G-C-H-D-I-J。由此可知二者是一致的。

树的后根遍历:E-F-G-B-H-C-I-J-D-A
对应的二叉树的后序遍历:G-F-E-H-J-I-D-C-B-A
对应的二叉树的中序遍历:E-F-G-B-H-C-I-J-D-A(与树的后根遍历相一致)

注意到我们并没有定义一般树的中根遍历,因为子结点该怎么分两部分并没有定义,所以只定义先、后根。
Example two:
例子2
⑴ 先序遍历:先访问根结点,然后依次先序遍历完每棵子树。如图的树,先序遍历的次序是:
ABCDEFGIJHK
⑵ 后序遍历:先依次后序遍历完每棵子树,然后访问根结点。如图的树,后序遍历的次序是:
CDBFIJGHEKA

森林的遍历

1.前序遍历
前序遍历的定义为:
(1)访问森林中第一棵树的根结点;
(2)前序遍历第一棵树的根结点的子树;
(3)前序遍历去掉第一棵树后的子森林。

2.中序遍历
中序遍历的定义为:
(1)中序遍历第一棵树的根结点的子树;
(2)访问森林中第一棵树的根结点;
(3)中序遍历去掉第一棵树后的子森林。
这里写图片描述
由上图看看这个森林和二叉树的各种遍历如下:
森林的先根遍历:A-B-C-D-E-F-G-H-J-I
二叉树森林的先序遍历:A-B-C-D-E-F-G-H-J-I(相同)
完整二叉树的先序遍历:A-B-C-D-E-F-G-H-J-I (相同)

森林的后根遍历:B-C-D-A-F-E-J-H-I-G
二叉树森林的后序遍历:D-C-B-A-F-E-J-I-H-G
完整二叉树的后序遍历:D-C-B-F-J-I-H-G-E-A(不同于二叉树森林的后序遍历)
二叉树森林的中序遍历:B-C-D-A-F-E-J-H-I-G(与森林的后根遍历相同)
完整二叉树的中序遍历:B-C-D-A-F-E-J-H-I-G(与森林的后根遍历相同,自然也与二叉树森林的中序遍历相同)
结论:
◆ 根据森林与二叉树的转换关系以及森林和二叉树的遍历定义可以推知,森林的前序遍历和中序遍历与所转换的二叉树的先序遍历和中序遍历的结果序列相同。
◆ 树的先序遍历实质上与将树转换成二叉树后对二叉树的先序遍历相同。
◆ 树的后序遍历实质上与将树转换成二叉树后对二叉树的中序遍历相同。

森林与二叉树的转换

树转化为二叉树:
⑴ 加虚线(或者粗实线)。在树的每层按从“左至右”的顺序在兄弟结点之间加虚线相连。
⑵ 去连线。除最左的第一个子结点(长子节点)外,父结点与所有其它子结点的连线都去掉。

森林转换成二叉树 :
当一般的树转换成二叉树后,二叉树的右子树必为空。若把森林中的第二棵树(转换成二叉树后)的根结点作为第一棵树(二叉树)的根结点的兄弟结点,则可导出森林转换成二叉树的转换步骤如下:
(1)、把每棵树转换为二叉树
(2)、按给出的森林中树的次序,第一棵树不动,从第二棵树开始,依次把后一棵树的根结点作为前一棵二叉树的根结点的右孩子,用线连起来,当所有的二叉树连接起来后,就得到了由森林转换来的二叉树。


欢迎扫码关注我的公众号「蜗牛永动机」,回复 1024 免费获取 5G 编程学习资源~

在这里插入图片描述

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

数据结构——树和森林的遍历方法 的相关文章

  • pip安装模块报错:File “D:\python\lib\site-packages\pip\_vendor\urllib3\response.py“, line 507, in read

    以下文章内容参考自 xff1a https blog csdn net qq 43348979 article details 115983927 解决参考原博 xff1a https blog csdn net liji digital
  • 自用git命令

    添加git默认信息 git config add user name 61 34 xxx 34 git config add user email 61 34 xxx 34 远程操作 git remote add origin xxxxx
  • npx命令

    参考文章 xff1a npx是什么命令 xff1f npx和npm有什么区别 xff1f 平时安装node模块的时候 xff0c 经常使用的命令是npm 其实还有另外一个命令 xff0c 叫做npx 网上的说法都是 xff1a npx是np
  • CSS替换元素

    参考文章 xff1a 替换元素 非替换元素 行内替换元素 行内非替换元素 img input到底是行内还是块级元素 xff1f 问题 xff1a img input到底是行内还是块级元素 xff1f 为什么有的行内元素可以撑开父元素 xff
  • PostgreSQL 查询怎么取到json中的字段值 有几种方法

    在PostgreSQL中可以使用多种方法来取到JSON中的字段值 xff0c 以下是其中的三种常用方法 xff1a 1 通过 gt 操作符取值 gt 操作符用于从JSON对象中提取一个键的值 例如 xff0c 假设有一个JSON对象 nam
  • Spring Data Jpa 使用关键字定义查询

    1 创建接口 BookDao java span class token keyword package span top span class token punctuation span woilanlan span class tok
  • 应用服务OkHttpClient创建大量对外连接时内存溢出

    文章目录 1 背景2 排查 2 1 原因 2 2 验证过程2 2 1 修改前2 2 2 修改后 3 解决 1 背景 最近工作中碰到一个生产问题 xff0c 就是应用服务在使用 OkHttpClient 时 xff0c 在创建大量对外连接时线
  • debian11安装docekr

    卸载旧版 apt get remove docker docker engine docker io containerd runc apt get purge docker ce docker ce cli containerd io d
  • C++中的枚举(enum)

    C 43 43 中的枚举 enum 枚举类型 enumeration 是 C 43 43 中的一种派生数据类型 xff0c 它是由用户定义的若干枚举常量的集合 枚举是一个数值集合 xff0c 是给一个值命名的一种方法 如果想要使用整数来表示
  • Django2.0版本的URL配置(笔记)

    升级到Django2 0后 xff0c URL配置发生了一些变化 以最简单的Hello World为例 xff1a views py from django http import HttpResponse def hello reques
  • Django笔记-模型层

    1 模型类定义 模型定义的基本结构 from django db import models class ModelName models Model field 61 models xxfield field 61 models xxfi
  • Django笔记(模型类-管理器)

    模型类 管理器 作用 xff1a 用于与数据库交互 每个模型类默认有一个管理器 xff0c objects objects是Django自动生成的管理器 xff0c 可以实现对数据的查询 objects是models Manger类的一个对
  • ubuntu-5-包管理工具dpkg和apt更新软件源及离线安装软件

    1 软件包安装卸载方法 1 1 apt方式 高级包装工具 Advanced Packaging Tools 简称APT 是Debian及其衍生发行版 如Ubuntu 的软件包管理器 APT可以自动下载 xff0c 配置 xff0c 安装二进
  • FRP|利用FRP完成内网穿透进行windows远程连接的步骤汇总

    文章目录 FRP 利用FRP完成内网穿透进行windows远程连接的步骤汇总本次配置过程的前提 xff1a 服务端配置详情客户端 xff08 windows电脑配置 xff09 FRP 利用FRP完成内网穿透进行windows远程连接的步骤
  • Linux回收站管理

    linux下的回收站在每一个当前用户目录 local share Trash中 xff08 HOME local share Trash files xff09 也可以给linux添加一个回收站 1 mkdir tmp trash tmp
  • Windows系统端口被占用解决方法

    今天使用idea跑一个git项目 xff0c 配置好tomcat后运行报错 xff0c 发现默认端口8080被占用 xff0c 用以下方法解决了问题 目录 解决方法 xff1a 1 打开终端 xff08 WIN 43 R或右键开始菜单选择
  • Ubuntu新硬盘多分区及挂载/home目录

    实验室新到了一块2T的硬盘 xff0c 我需要装在我的电脑上 我自己的电脑本身是双硬盘双系统win10 43 ubuntu16 04 xff0c 其中win10装在一个256GB的固态硬盘上 xff1b ubuntu16 04装在机械硬盘上
  • 2021,我还在路上

    去年写的总结还历历在目 xff0c 只是没发表 今年照例收个尾 xff0c 由于昨天太多人发 xff0c 刻意避开了 今年对我来说 xff0c 是很平凡的一年 xff0c 感觉做了很多事 xff0c 认真回顾又感觉好像也没做什么事 今年也是
  • SpringBoot+MyBatis基于mysql-8.0.11(最新版)的连接测试

    1 项目依赖 xff1a lt 数据源 gt lt dependency gt lt groupId gt com alibaba lt groupId gt lt artifactId gt druid lt artifactId gt
  • logback-spring.xml中MaxHistory日志文件保留天数不生效

    问题 xff1a logback xml中MaxHistory日志文件保留天数不生效 xff0c 文件是10 1 10 8配置MaxHistory为7不会删除10 1的日志文件 MaxHistory指的是文件数量 xff0c 不包过当天日志

随机推荐