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

  • 树这种数据结构的出现主要是对链表数据结构的优化,链表数据结构是线性结构,操作一般需要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. 层次遍历

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

一层循环时间复杂度_数据结构:二叉排序树的前/中/后序遍历(递归与循环两种版本)...相关推荐

  1. [Leedcode][JAVA][第94/144/145题][前中后序遍历][递归][迭代][二叉树]

    [问题描述][] 前序遍历 先输出当前结点的数据,再依次遍历输出左结点和右结点 中序遍历 先遍历输出左结点,再输出当前结点的数据,再遍历输出右结点 后续遍历 先遍历输出左结点,再遍历输出右结点,最后输 ...

  2. 【Java数据结构】二叉树的前中后序遍历(递归和非递归)

    二叉树的遍历 递归做法 前序遍历 中序遍历 后序遍历 非递归 前序遍历 中序遍历 后序遍历 二叉树遍历是二叉树的一种重要操作 必须要掌握 二叉树的遍历可以用递归和非递归两种做法来实现 递归做法 前序遍 ...

  3. 【霍罗维兹数据结构】二叉树前中后序遍历 | 层序遍历 | 复制二叉树 | 判断两个二叉树全等 | 可满足性问题

    写在前面 学习二叉树结构,最简单的方式就是遍历.所谓二叉树遍历,就是按照某种特定的规则,一次对二叉树中的节点进行相应的操作,并且每个节点只操作一次. 访问节点所做的操作要看具体的应用问题.遍历是二叉树 ...

  4. 二叉树前中后序遍历+刷题【中】【数据结构/初阶/C语言实现】

    文章目录 1. 二叉树基础操作 1.1 二叉树遍历 1.1.1 前序遍历 前序遍历(Pre-Order Traversal) 1.1.2 中序遍历 中序遍历(In-Order Traversal) 1 ...

  5. 数据结构-二叉树(包含二叉树的层次建树、前中后序遍历、层次遍历解析及代码)

    目录 一.树与二叉树的原理解析 1.树的定义 2.树的结构和特点 3.二叉树的定义 4.树结点的数据结构 二.二叉树的层次建树 1.二叉树层次建树的原理及分析 2.完整代码 三.二叉树的前中后序遍历 ...

  6. 二叉树的前,中,后序遍历(思路分析) [Java][数据结构]

    二叉树的前,中,后序遍历(思路分析) 前序遍历: 先输出父节点, 再遍历左子树和右子树 中序遍历: 先遍历左子树, 再输出父节点,再遍历右子树 后序遍历: 先遍历左子树,再遍历右子树,最后输出父节点 ...

  7. LeetCode——树:层次遍历、前中后序遍历

    LeetCode--树:层次遍历.前中后序遍历 目录 层次遍历 二叉树的层平均值 找树左下角的值 前中后序遍历 概述 非递归实现二叉树的前序遍历 非递归实现二叉树的中序遍历 非递归实现二叉树的后序遍历 ...

  8. 二叉树的层序遍历和前中后序遍历代码 迭代/递归

    二叉树的层序遍历和前中后序遍历代码 迭代/递归 只记录代码.思路参考代码随想录:https://github.com/youngyangyang04/leetcode-master/blob/mast ...

  9. 二叉树前中后序遍历的非递归实现以及层次遍历、zig-zag型遍历详解

    前言 二叉树的遍历是一个比较常见的问题,递归实现二叉树的前中后序遍历比较简单,但非递归实现二叉树的前中后序遍历相对有难度.这篇博客将详述如何使用非递归的方式实现二叉树的前中后序遍历,在进行理论描述的同 ...

最新文章

  1. 激光雷达与相机:哪个最适合自动驾驶汽车?
  2. 【c语言】蓝桥杯算法训练 乘法表
  3. Linq To Sql中实现Left Join与Inner Join使用Linq语法与lambda表达式
  4. 0.1+0.2==0.3?
  5. js变量后面加问号是什么_js没那么简单(1)-- 执行上下文
  6. linux centos 7安装 apache php 及mariadb
  7. android对skia的封装,Skia引擎API整理介绍(skia in Android 2.3 trunk)
  8. k近邻算法C++二维情况下的实现
  9. 计算机视觉领域常见期刊和会议,计算机视觉领域常见期刊和会议
  10. linux 系统调用时怎么知道当前上下文属于那个进程,linux – 编写系统调用来计算进程的上下文切换...
  11. php 漂亮的分页类
  12. java实例分析宠物商店_java实例分析:宠物商店.ppt
  13. NetCore 2.0 + Swagger 的WebAPI 模板例子
  14. 错误org.hibernate.HibernateException: Error applying BeanValidation relational constraints的解决方法
  15. 【java】自动写入数据到文件夹中
  16. 校友故事|我在科大感受理工科“严谨的浪漫主义”
  17. C语言 输出Sn = a + aa + aaa + aaaa + ······
  18. 如何更电计算机共享名称,手机电脑电视之间如何共享、投屏?
  19. 【实验室集训大作业】JDBC实现宠物商店
  20. 云呐|如何对酒店固定资产进行日常管理

热门文章

  1. 1.IDA-基本操作(改变Image Base地址、打开、保存IDA的不同方式)
  2. cocos2d-x游戏实例(21)-纵版射击游戏(8)
  3. Anbox 实现分析 3:会话管理器与容器管理器的通信
  4. navicat for mysql 连接时报错:1251-Client does not support authentication protocol requested by server
  5. 计算机专业有什么血泪建议吗?
  6. 如何在 IDEA 使用Debug 图文教程
  7. JAVA通信编程(三)——TCP通讯
  8. 优化 Golang 分布式行情推送的性能瓶颈
  9. 新一代音视频技术架构驱动未来多媒体创新
  10. 大牛书单 | 腾讯技术大咖推荐你五一看这些书