二叉树遍历前序中序后序_二叉树先序遍历算法

树的设计初衷与操作时间复杂度

  • 树这种数据结构的出现主要是对链表数据结构的优化,链表数据结构是线性结构,操作一般需要O(N)的时间复杂度,树是链表的变形,即链表的每个节点包含一个节点,而树的节点可以包含多个节点,如二叉树为根节点,左节点,右节点三个节点组成一个大节点,所以相对链表来说,相同的节点个数由于这种大节点的存在,故长度变小了,每次可以获取更多个子节点的信息,操作时间复杂度也减小了,如二叉树一般为O(logN),多路搜索树则节点更大,故路径更短,操作时间复杂度更小。其实就是一种空间换时间的设计。
  • 不只是计算机领域采用这种思路来优化,生活领域也是,如加法和乘法,其实乘法都可以通过加法来替代,但是使用乘法相对加法表示更加简单,如10个一相加,如果加法则需要写出1+1+…+1,而乘法只需要10*1。只需要让人类知道这个符号的含义即可。

算法设计

  • 除了优化时间复杂度外,树的每个节点可以根据设计意图来存放不同的数据,并且可以进一步根据根节点,子树的区别来进一步设计,如二叉树如果用于处理算术表达式,则左右节点可以存放操作数,根节点存放操作符;用于排序则左节点存放最小的数据,根节点其次,右节点存放最大的。

二叉树

  • 定义:每个节点包含至多两个节点,这两个节点分别称为左节点和右节点,如下:

二叉树遍历前序中序后序_二叉树先序遍历算法

  • 树的每个节点可以
  • 数据排序:如果树节点存放数值

1. 先序遍历

  • 概念:先遍历根节点,再遍历左节点,最后遍历右节点。
  • 根节点 -> 左子树 -> 右子树

递归实现

二叉树遍历前序中序后序_二叉树先序遍历算法

循环实现

  • 结合栈(后进先出)来实现:根先入栈,然后开始循环遍历:根节点出栈,先右子树入栈,然后是左子树入栈,则在出栈的时候,左子树先出栈,右子树后出栈,实现:root -> left -> right。以下中序和后序设计思路类似。

二叉树遍历前序中序后序_二叉树先序遍历算法

2. 中序遍历

  • 概念:先遍历左节点,再遍历根节点,最后遍历右节点。
  • 左子树 -> 根节点 -> 右子树

递归实现

二叉树遍历前序中序后序_二叉树先序遍历算法

循环实现

  • 由于中序遍历是:left -> root -> right,故可能会出现子树的root重复入栈来保存栈中:right -> root -> left的顺序,故需要记录root是否处理过了,处理过了则第二次出栈时直接出栈即可,不需要再处理左右子树,避免死循环。

二叉树遍历前序中序后序_二叉树先序遍历算法

3. 后序遍历

  • 概念:先遍历左节点,再遍历右节点,最后遍历根节点。
  • 左子树 -> 右子树 -> 根节点

递归实现

二叉树遍历前序中序后序_二叉树先序遍历算法

循环实现

  • 思路与中序遍历类似。

二叉树遍历前序中序后序_二叉树先序遍历算法

4. 层次遍历

  • 从根节点开始,逐层从左到右遍历每一层的节点。

二叉树遍历前序中序后序_二叉树先序遍历算法

本文【二叉树遍历前序中序后序_二叉树先序遍历算法】由作者: 外键 提供,本站不拥有所有权,只提供储存服务,如有侵权,联系删除!
本文链接:https://www.cuoshuo.com/blog/4239.html

(0)
上一篇 2023-03-11 08:33:34
下一篇 2023-03-11 08:37:11

相关推荐

  • 黑莓9930电子书软件,黑莓9930能不能用QQ

    使用黑莓的用户,有很明显的个性特质,他们很酷但不冷漠,友善内敛,极其注重效率,专注于自己的事务,不喜欢炫技,但乐于帮助和分享。 在满街都是诺基亚、摩托罗拉、三星、索尼爱立信的年代,有一个手机品牌永远显得特立独行,在人群中永远亮眼,只要你把手机掏出来,气场立马与众不同,能让旁人不禁在心中惊呼“好酷!” 它叫黑莓。 从美国辐射全球的影响力 不是所有小众都等于酷,…

    2023-03-19
    100
  • accept函数的用法和参数_accept搭配用法

    tcp服务器端一次调用socket/bind/listen之后,就会监听指定的socket地址了。tcp客户端依次调用socket/connect之后就向tcp服务器发送了一个连接请求。tcp服务器监听到这个请求之后,就会调用accept函数接收请求,这样连接就建立好了,之后就可以开始网络i/o操作了,即类同于普通文件的读写i/o操作。 int accept…

    2023-03-11
    1000
  • bin文件用什么软件打开,bin文件怎么打开

    虽然我们平时标准的Windows格式都是来来回回那几种通用格式,但是你收到的文件却不一定是,它往往变成你不认识的格式,比如说文件类型格式显示bin。为什么会产生这样的问题呢? 1、 下载并运行“UltraISO”软件-文件-打开 2、 选择“xx.bin”文件,点击“打开” 3、 如果能正常打开,则表示这个文件就是光盘镜像文件,软件的右侧会出现bin文件里面…

    2023-03-18
    000
  • 软件开发详细设计文档怎么写

    概述 本文主要为需要编写软件设计/开发文档的读者提供一些经验和建议。 阅读前提 了解 Markdown 语法 了解 Typora、Sublime Text 或 VS Code 等方便编辑 Markdown 的编辑器 面向读者 需要编写产品/功能描述文档的产品经理、项目经理 需要针对待开发功能编写基本设计、详细设计的软件工程师 1. 软件和文档格式选择 一般来…

    2023-03-18
    000
  • flash课件制作实例教程(flash课件制作成品)

    flash课件动画制作做到灵活运用的方法。Flash课件动画制作在教学中的应用已经屡见不鲜,从幼教的flash卡通动画课件到中高等教育的flash实验教学课件,都能够发挥flash动画在不同阶段的优势。伴随教育形式的多样化,flash课件动画制作也需要做到灵活运用,对此艾漫客动画做出了以下分享。 Flash课件动画制作单凭视觉元素传递信息,会使学生感到单调、…

    2023-03-18
    000
  • html特殊字符空格的代码_html文本开头空两格

    一、什么是HTML HTML简介 HTML是用来描述网页的一种语言,它是一种超文本标记语言,由一套标记标签组成,在制作网页时,HTML使用标记标签来描述网页。 发展史 HTML:Hyper Text Markup Language超文本标记语言 超文本标记语言—在1993年6月互联网工程工作小组工作案发布(并非标准) HTML2.0—1995年11月作为RF…

    2023-03-11
    400
  • vhdl分频器时钟频率50MHz,10分频器的VHDL代码

    7. 分频器设计(分频输出:1Hz或2Hz的信号) 要求:实验开发板上有一个50MHz的时钟脉冲(此频率过高,接到开发板的LED灯后,无法观察到LED灯一 亮一灭的过程),设计一个分频器,使得分频后的时钟脉冲接到开发板上的LED灯后,肉眼可以观察到LED灯 闪烁。 8. 设计一个十进制加法计数器 使用设计的分频器的输出信号作为计数器的时钟输入,再利用第二次实…

    2023-03-18
    100
  • 内存使用率高会怎么样_内存到底影响什么

    用安卓系统的朋友会经常遇到手机开机后就占用了绝大多数系统内存的尴尬局面。 为了降低手机内存耗费,绞尽脑汁,习惯了是不久就优化一下,清理一下,结束下进程。是否想过一个问题,是我们做的不对还是手机本来就这样挺好呢? 重启了下手机,什么都没开,又优化了下,系统内存使用率还是在50%左右。 内存使用率高原因之一 安装了过多软件,开机自动启动。 很多软件安装后,都会默…

    2023-03-15
    100
  • 怎样自学电脑编程入门,如何学电脑编程入门

    可以从自己感兴趣的领域入手,从基础到进阶学习相关的编程语言,逐步实践做项目。 先跟我一起来了解编程语言及其应用: Python——一种很好的入门语言,用于web应用程序、游戏领域、人工智能和大数据 Java——用于无数种程序中,从游戏到web应用程序再到ATM软件 HTML——任何web开发人员的基本起点 C语言——是一种较古老的语言,C仍然是一个强大的工具…

    为你推荐 2023-03-21
    000
  • ldap是什么认证

    如果您是刚接触Active Directory (AD)的初学者,那么当您发现LDAP这个术语时可能会感到十分迷茫。今天就让我们来帮您熟悉 LDAP,相信这对于您学习AD域管理也会有帮助。 首先,让我们直面主题!什么是 LDAP? LDAP指轻型目录访问协议,允许用户查询自身及其他用户属性、资源、应用程序和其他活动目录的详细信息。它是使AD域各类功能成为可能…

    2023-03-19
    000

发表回复

登录后才能评论
返回顶部
错说博客上线啦!