【数据结构与算法基础】二叉树
写在前面
上面一篇介绍了简单的线性的数据结构浅入浅出数据结构(二)堆栈与队列 这一篇研究一些复杂的数据结构:树和二叉树。
1.二叉树简介
二叉树是一种最简单的树形结构,其特点是树中每个结点至多关联到两个后继结点;另一个特点是一个节点关联的后继结点明确地分左右。
(1)定义:二叉树是结点的有穷集合。这个集合可以为空,若不为空,则它是由根结点和称为其左子树和右子树的两个不想交的二叉树组成。
很明显二叉树的定义是一种递归结构。下图给出了五种二叉树的基本形态。
(2)一些基本概念:空树、单点树、父节点、子节点、兄弟结点、树叶结点、分支结点、度数、路径(长度)、结点的层、高度(深度)
(3)性质:
(4)满二叉树:如果二叉树中所有分支结点的度数都为2,则称它为一颗满二叉树。
满二叉树里的叶节点比分支结点多一个。
(5)扩充二叉树:对二叉树T,加入足够多的新叶节点,是T的原有结点都变成度数为2的分支结点,得到的二叉树称为T的扩充二叉树。扩充二叉树新增的节点称为其外部结点,原树的节点称为其内部结点
扩充二叉树的外部结点比其内部结点的个数多1
(6)完全二叉树:如下所示,除最下两层外,其余结点度数都是2(显然都不是叶结点),如果最下一层的结点不满,则所有空位都在在右边,左边没有空位。
一般而言,n个结点的二叉树中最长路径为O(n)。对于所有的n个结点的二叉树,其最长路径的平均值为O(log n)。
2.二叉树数据结构
BiTree(self,data,left,right) | #创建一个新二叉树 |
is_empty(self) | #判断是否为一颗空树 |
num_nodes(self) | #求二叉树的节点个数 |
data(self) | #获取二叉树树根存储的数据 |
left(self) | #获取二叉树的左子树 |
right(self) | #获取二叉树的右子树 |
set_left(self,btree) | #用btree取代原来的左子树 |
set_right(self,btree) | #用btree取代原来的右子树 |
traversal(self) | #遍历二叉树中各节点的数据 |
forall(self,op) |
#对二叉树中每个结点的数据执行操作op |
- 二叉树的遍历
在二叉树的操作中,其他操作的实现都比较简单,这里重点是二叉树的遍历操作。二叉树的遍历可按二叉树的构造以及访问结点的顺序分为四种方式,即先序遍历、中序遍历、后序遍历和层序遍历。
(a)中序遍历
它是指对树中任一结点的访问是在遍历完其左子树后进行的,访问此节点后,再对其右结点遍历。其遍历过程为:中序遍历左子树;访问根结点;中序遍历右子树;
(b)先序遍历
它是指对结点的访问在其左、右子树遍历之前进行。其遍历过程为:访问根结点;先序遍历左子树;先序遍历右子树;
(c)后序遍历
它是指结点左右子树的遍历先进行,然后才是根结点的访问。其遍历过程为:后序遍历左子树;后序遍历右子树;访问根结点;
(d)非递归遍历
前述三种都是递归结构,但是递归虽然简介,却存在执行效率不高的问题,因此,就存在如何把一个递归算法转化为非递归算法的问题。
分析可知,返回结点的顺序与进入结点的顺序相反,即先进入后返回,正好符合堆栈结构。因此可以借助堆栈来实现二叉树的非递归遍历。
(5)层序遍历
层序遍历是按树的层次,从第一层的根结点开始向下逐层访问各个结点,对某一层的节点按从左往右的顺序。这一实现与队列的结构是类似的。
具体的算法实现可以设置一个队列结构,遍历从根结点开始,首先将根结点指针入队,然后开始执行下面三个操作:①从队列中取出一个元素;②访问该元素所指结点;③若钙元素所指结点的左右孩子结点非空,则将其左右孩子的指针顺序入队。不断执行这三步,直至队列为空。
- 二叉树的创建
二叉树是非线性结构,创建一颗二叉树必须首先确定树中结点的输入顺序,常用的有遍历创建和层序创建。
(1)层序创建
层序创建所用的节点输入序列是按树的从上至下从左至右的顺序形成的,各层的空节点输入数值0。利用的是队列的先进先出特性,每次访问一个节点的时候,将其存入队列中,待遍历完当前结点的左右孩子结点,队列就弹出一个节点。
()遍历创建
遍历创建是基于堆栈的数据结构实现的。递归建树的过程无非就是一路走到底,但是需要将节点的左右孩子节点对其余的节点相关联起来。
def traversal_create(self, root):data = input()if data is "#":return Noneelse:root.data = dataroot.lchild = self.traversal_create(root.lchild)root.rchild = self.traversal_create(root.rchild)return root
- 二叉树的list实现
- 二叉树的链接实现
与连续表的链接实现技术类似:用一个数据单元表示一个二叉树结点,通过子节点链接(指针)建立结点之间的联系。 包括一个二叉树结点类和二叉树类。
上述相关的代码已上传至我的Github,欢迎star~: data_structure/Tree/BinaryTree
以上~
2018.04.27
【数据结构与算法基础】二叉树相关推荐
- 【数据结构与算法基础】树与二叉树的互化
前言 数据结构,一门数据处理的艺术,精巧的结构在一个又一个算法下发挥着他们无与伦比的高效和精密之美,在为信息技术打下坚实地基的同时,也令无数开发者和探索者为之着迷. 也因如此,它作为博主大二上学期最重 ...
- 数据结构与算法之-----二叉树(一)
[ 写在前面的话:本专栏的主要内容:数据结构与算法. 1.对于初识数据结构的小伙伴们,鉴于后面的数据结构的构建会使用到专栏前面的内容,包括具体数据结构的应用,所使用到的数据结构,也是自己构建的,未使用 ...
- python数据结构与算法知识点_数据结构和算法基础知识点(示例代码)
数据结构和算法基础知识点 链表 1.链表是一种由节点组成的线性数据集合,每个节点通过指针指向下一个节点.它是 一种由节点组成,并能用于表示序列的数据结构. 2.单链表:每个节点仅指向下一个节点,最后一 ...
- 数据结构与算法基础-青岛大学-王卓
数据结构与算法基础(青岛大学-王卓)_哔哩哔哩_bilibili 文章目录: 第一章:数据结构的基本概念 1.逻辑结构的种类 2.存储结构的种类 3.抽象数据类型的形式定义 4.Complex抽象书 ...
- 【数据结构与算法基础】AOE网络与关键路径
前言 数据结构,一门数据处理的艺术,精巧的结构在一个又一个算法下发挥着他们无与伦比的高效和精密之美,在为信息技术打下坚实地基的同时,也令无数开发者和探索者为之着迷. 也因如此,它作为博主大二上学期最重 ...
- 【数据结构与算法基础】最短路径问题
前言 数据结构,一门数据处理的艺术,精巧的结构在一个又一个算法下发挥着他们无与伦比的高效和精密之美,在为信息技术打下坚实地基的同时,也令无数开发者和探索者为之着迷. 也因如此,它作为博主大二上学期最重 ...
- 数据结构与算法基础——重要知识点截图【青岛大学-王卓版】
文章目录: 第一章:数据结构的基本概念 1.逻辑结构的种类 2.存储结构的种类 3.抽象数据类型的形式定义 4.Complex抽象书籍类型中的基本操作 5.概念小结 6.时间复杂度 7.空间复杂度 ...
- 数据结构与算法:二叉树专题
数据结构与算法:二叉树专题 前言 前提条件 基础知识 二叉树链式存储结构 二叉树中序遍历 二叉树层序遍历 常见编程题 把一个有序整数数组放到二叉树中 逐层打印二叉树结点数据 求一棵二叉树的最大子树和 ...
- 数据结构与算法基础(java版)
目录 数据结构与算法基础(java版) 1.1数据结构概述 1.2算法概述 2.1数组的基本使用 2.2 数组元素的添加 2.3数组元素的删除 2.4面向对象的数组 2.5查找算法之线性查找 2.6查 ...
- 第六章.数据结构与算法基础
目录 第六章.数据结构与算法基础(重点) 第一节.数组与矩阵 数组 稀疏矩阵 第二节.数据结构的定义 第三节.线性表 链表详解 顺序存储与链式存储对比 队列与栈 第四节.广义表 第五节.树与二叉树 树 ...
最新文章
- CVPR 2020: 移动端机器学习的研究实现
- 顶级项目管理工具 Top 10
- Nginx中添加gzip_static支持
- ElasticSearch Java Api(一) -创建索引
- 手环是如何测试人体健康数据?
- Java EE 企业网站_基于jsp的企业网站系统-JavaEE实现企业网站系统 - java项目源码...
- 性能测试之JMeter配置元件【随机变量】
- hadoop 权威指南学习笔记ing(1)
- 用Java制作一个家庭收支记账软件
- cad 2019 mac安装破解详细图文教程
- video.js播放m3u8视频
- 二进制bit0是什么意思_阜平吧在讨论5G的问题,感觉挺有意思,科普下……
- Windows Sever 2016 创建DNS服务器并配置转发器及条件转发器
- 大数据Python基础学习——练习(一)
- 根据卫星仰角和方位角使用html5绘制天空图(投影图)
- Compound学习(二) 简单部署
- 一个“吃货”的广州一日游~
- 其他EFA相关的包和其他潜变量模型
- 2019中国电子商务产业园区经济发展论坛暨第四届国家电子商务示范基地联盟峰会在深圳召开...
- 鬼畜视频创作神器——EDIUS Pro 非线性视频编辑软件(9.0)汉化特别版
热门文章
- SAP License:SAP实施应该建立扁平化组织结构
- 资产分池中的量化实战
- MongoDB练习题
- 水库大坝安全监测系统/水利平台高保真原型/大坝安全监测分析预警系统 /工程监测/工程档案/环境量监测/位移监测/渗压监测/工程管理/报警管理/横河向位移监测/历史数据/工程档案/顺河向位移监测
- Servlet JSP和Spring MVC初学指南 PDF
- C#多线程之线程池篇2
- video标签播放视频
- c/c++ 指针函数 和 函数指针
- 交换排序之冒泡排序(java实现)
- CLR_via_C#.3rd 翻译[25.9 线程调度和优先权]