一层循环时间复杂度_数据结构:二叉排序树的前/中/后序遍历(递归与循环两种版本)...
树的设计初衷与操作时间复杂度
- 树这种数据结构的出现主要是对链表数据结构的优化,链表数据结构是线性结构,操作一般需要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. 层次遍历
- 从根节点开始,逐层从左到右遍历每一层的节点。
一层循环时间复杂度_数据结构:二叉排序树的前/中/后序遍历(递归与循环两种版本)...相关推荐
- [Leedcode][JAVA][第94/144/145题][前中后序遍历][递归][迭代][二叉树]
[问题描述][] 前序遍历 先输出当前结点的数据,再依次遍历输出左结点和右结点 中序遍历 先遍历输出左结点,再输出当前结点的数据,再遍历输出右结点 后续遍历 先遍历输出左结点,再遍历输出右结点,最后输 ...
- 【Java数据结构】二叉树的前中后序遍历(递归和非递归)
二叉树的遍历 递归做法 前序遍历 中序遍历 后序遍历 非递归 前序遍历 中序遍历 后序遍历 二叉树遍历是二叉树的一种重要操作 必须要掌握 二叉树的遍历可以用递归和非递归两种做法来实现 递归做法 前序遍 ...
- 【霍罗维兹数据结构】二叉树前中后序遍历 | 层序遍历 | 复制二叉树 | 判断两个二叉树全等 | 可满足性问题
写在前面 学习二叉树结构,最简单的方式就是遍历.所谓二叉树遍历,就是按照某种特定的规则,一次对二叉树中的节点进行相应的操作,并且每个节点只操作一次. 访问节点所做的操作要看具体的应用问题.遍历是二叉树 ...
- 二叉树前中后序遍历+刷题【中】【数据结构/初阶/C语言实现】
文章目录 1. 二叉树基础操作 1.1 二叉树遍历 1.1.1 前序遍历 前序遍历(Pre-Order Traversal) 1.1.2 中序遍历 中序遍历(In-Order Traversal) 1 ...
- 数据结构-二叉树(包含二叉树的层次建树、前中后序遍历、层次遍历解析及代码)
目录 一.树与二叉树的原理解析 1.树的定义 2.树的结构和特点 3.二叉树的定义 4.树结点的数据结构 二.二叉树的层次建树 1.二叉树层次建树的原理及分析 2.完整代码 三.二叉树的前中后序遍历 ...
- 二叉树的前,中,后序遍历(思路分析) [Java][数据结构]
二叉树的前,中,后序遍历(思路分析) 前序遍历: 先输出父节点, 再遍历左子树和右子树 中序遍历: 先遍历左子树, 再输出父节点,再遍历右子树 后序遍历: 先遍历左子树,再遍历右子树,最后输出父节点 ...
- LeetCode——树:层次遍历、前中后序遍历
LeetCode--树:层次遍历.前中后序遍历 目录 层次遍历 二叉树的层平均值 找树左下角的值 前中后序遍历 概述 非递归实现二叉树的前序遍历 非递归实现二叉树的中序遍历 非递归实现二叉树的后序遍历 ...
- 二叉树的层序遍历和前中后序遍历代码 迭代/递归
二叉树的层序遍历和前中后序遍历代码 迭代/递归 只记录代码.思路参考代码随想录:https://github.com/youngyangyang04/leetcode-master/blob/mast ...
- 二叉树前中后序遍历的非递归实现以及层次遍历、zig-zag型遍历详解
前言 二叉树的遍历是一个比较常见的问题,递归实现二叉树的前中后序遍历比较简单,但非递归实现二叉树的前中后序遍历相对有难度.这篇博客将详述如何使用非递归的方式实现二叉树的前中后序遍历,在进行理论描述的同 ...
最新文章
- 激光雷达与相机:哪个最适合自动驾驶汽车?
- 【c语言】蓝桥杯算法训练 乘法表
- Linq To Sql中实现Left Join与Inner Join使用Linq语法与lambda表达式
- 0.1+0.2==0.3?
- js变量后面加问号是什么_js没那么简单(1)-- 执行上下文
- linux centos 7安装 apache php 及mariadb
- android对skia的封装,Skia引擎API整理介绍(skia in Android 2.3 trunk)
- k近邻算法C++二维情况下的实现
- 计算机视觉领域常见期刊和会议,计算机视觉领域常见期刊和会议
- linux 系统调用时怎么知道当前上下文属于那个进程,linux – 编写系统调用来计算进程的上下文切换...
- php 漂亮的分页类
- java实例分析宠物商店_java实例分析:宠物商店.ppt
- NetCore 2.0 + Swagger 的WebAPI 模板例子
- 错误org.hibernate.HibernateException: Error applying BeanValidation relational constraints的解决方法
- 【java】自动写入数据到文件夹中
- 校友故事|我在科大感受理工科“严谨的浪漫主义”
- C语言 输出Sn = a + aa + aaa + aaaa + ······
- 如何更电计算机共享名称,手机电脑电视之间如何共享、投屏?
- 【实验室集训大作业】JDBC实现宠物商店
- 云呐|如何对酒店固定资产进行日常管理
热门文章
- 1.IDA-基本操作(改变Image Base地址、打开、保存IDA的不同方式)
- cocos2d-x游戏实例(21)-纵版射击游戏(8)
- Anbox 实现分析 3:会话管理器与容器管理器的通信
- navicat for mysql 连接时报错:1251-Client does not support authentication protocol requested by server
- 计算机专业有什么血泪建议吗?
- 如何在 IDEA 使用Debug 图文教程
- JAVA通信编程(三)——TCP通讯
- 优化 Golang 分布式行情推送的性能瓶颈
- 新一代音视频技术架构驱动未来多媒体创新
- 大牛书单 | 腾讯技术大咖推荐你五一看这些书