数据结构与算法6—树

 

树的表示方式有

  1.  树形图表示法:逻辑结构描述直观
  2.  嵌套集合表示法(文氏图表示法)
  3.  凹入表示法
  4.  广义表表示法

二叉树

二叉树是另一种重要的树形结构,是度为2的有序树,它的特点是每个结点至多有两棵子树。

 

二叉树的递归定义

二叉树是n(n≥0)个结点的有限集。它或者是空集(n=0),或者同时满足以下两个条件:

    (1) 有且仅有一个根结点;

    (2) 其余的结点分成两棵互不相交的左子树和右子树。

 

二叉树的特点

如果二叉树的根结点只有一棵子树,必须明确区分它是左子树还是右子树,因为两者将构成不同形态的二叉树。

注意:二叉树不是树的特例。它们是两种不同的数据结构。

 

二叉树举例

 

二叉树的性质

性质1:在二叉树的第i层上至多有2i-1 个结点。 (i≥1)

 

性质2:深度为 k 的二叉树上至多含 2k-1 个结点(k≥1)

证明:

性质3:对任何一棵二叉树,若它含有n0个叶子结点、n2个度为2的结点,则必存在关系式:n0= n2+1。

叶子结点数=度2结点 + 1

性质4:具有n个结点的完全二叉树的深度为 [log2n] +1  下取整

证明:

性质5:

若对含 n 个结点的完全二叉树从上到下且从左至右进行 1 至 n 的编号,则对完全二叉树中任意一个编号为 i 的结点:

    (1) 若 i=1,则该结点是二叉树的根,无双亲, 否则,编号为 i/2 的结点为其双亲结点;

    (2) 若 2i>n,则该结点无左孩子,否则,编号为 2i 的结点为其左孩子结点;

    (3) 若 2i+1>n,则该结点无右孩子结点, 否则,编号为2i+1 的结点为其右孩子结点。

 

两类特殊的二叉树:

满二叉树

指的是深度为k且含有2k - 1个结点的二叉树。

特点:

(1)每一层上结点数都达到最大

(2)度为1的结点n1=0,树叶都在最下一层。

满二叉树结点层序编号方法:

从根结点起从上到下逐层(层内从左到右)对二叉树的结点进行连续编号。

 

 完全二叉树

树中所含的 n 个结点和满二叉树中编号为 1 至 n 的结点一一对应。

完全二叉树的特点:

1、满二叉树是完全二叉树,完全二叉树不一定是满二叉树;

2、在完全二叉树中,若某个结点没有左孩子,则它一定没有右孩子,即该结点必是叶结点。

 

 二叉树的存储结构:

 1.顺序存储结构

用一组地址连续的存储单元,以层序顺序存放二叉树的数据元素,结点的相对位置蕴含着结点之间的关系。

如完全二叉树

非完全二叉树,存储时必须将相应的位置空出来,使存放的结果符合完全二叉树的形状。

 

所以,二叉树顺序存储结构仅适用于完全二叉树。

若存储非完全二叉树时有可能对存储空间造成极大的浪费:

在最坏的情况下,一个深度为K且只有K个结点的右单支树需要2K-1个结点存储空间。

 

二叉树的链式存储结构

根据二叉树的非线性结构的特点,常用链式存储方式来表示二叉树。

二叉树的链式存储结构有3种,它们是二叉链表三叉链表线索链表

 二叉链表存储结构

把每个结点分成三个域:一个域存放结点本身的信息,另外两个是指针域,分别存放左、右孩子的地址。每个结点的结构表示为:

 

 二叉链表的C 语言类型描述如下:

typedef char TElemType;
typedef struct Node { TElemType      data;struct Node  *lchild, *rchild; 
} BiTNode, *BiTree;

 

三叉链表(带双亲指针的二叉链表)

 

转载于:https://www.cnblogs.com/lisen10/p/10850336.html

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/263989.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

动态改变stage桢数

动态改变stage桢数 stage.frameRate speed; 转载于:https://www.cnblogs.com/jiahuafu/archive/2010/03/29/1699434.html

约瑟夫环 java_约瑟夫环Java实现

/*** 约瑟夫问题* 设编号为 1&#xff0c;2&#xff0c;… n 的 n 个人围坐一圈&#xff0c;* 约定编号为 k(1<k<n)的人从 1 开始报数&#xff0c;* 数到 m 的那个人出列&#xff0c;* 它的下一位又从 1 开始报数&#xff0c;数到 m 的那个人又出列&#xff0c;* 依次类推…

LNMP一键安装包在安装完成后的一些安全设置

2019独角兽企业重金招聘Python工程师标准>>> 1.修改php.ini中的 base_dir 设定为&#xff1a;open_basedir/home/wwwroot/:/tmp/&#xff0c; 这样&#xff0c;脚本只能在wwwroot和tmp下读取。 2.设定权限&#xff0c;防止跨目录列表。 chown root:root wwwroot c…

Python——Django框架——Model数据库模型

一、设置 1、Django的setting中配置数据库(MySQL配置) DATABASES {default: {ENGINE: django.db.backends.mysql,NAME: 数据库名称,USER: 数据库用户名,PASSWORD: 数据库密码,HOST: 主机地址,POST: 端口号,} }INSTALLED_APPS [django.contrib.admin,django.contrib.auth,djan…

boot nk.bin by CEPC

build nk.bin \public\common\oak\misc\wince.bat X86 wpc CEPC platform builder 启动 CEPC 1 安装 virtual pc 2007 2 新建 VM 3 设置 capture floppy disk image platform\cepc\src\bootloader\dos\bootdisk\diskimage\cepcboot.144转载于:https://www.cnblogs.co…

java定时执行一次_java Timer(定时调用、实现固定时间执行)

最近需要用到定时调用的功能。可以通过java的Timer类来进行定时调用&#xff0c;下面是有关Timer的一些相关知识。其实就Timer来讲就是一个调度器,而TimerTask呢只是一个实现了run方法的一个类,而具体的TimerTask需要由你自己来实现,例如这样:Timer timer newTimer();timer.sc…

忧郁

网络确实是个好东西&#xff0c;她让我们知识丰富起来&#xff0c;让我们沟通更方便&#xff0c;让世界更小了。 博客确实是个好东西&#xff0c;她记录博主的成长。 但是最近经常被博客郁闷到&#xff0c;本来我就是一个忧郁的人&#xff0c;每当我看到有些博客更新了几年最后…

docker基础应用

环境&#xff1a; centos 7 docker 19.03.0-beta3 192.168.10.10 关于如何安装docker请参考&#xff1a;https://www.cnblogs.com/caesar-id/p/10857312.html 1、查找合适的版本 [rootlocalhost ~]# docker search centos 2、下载centos镜像 [rootlocalhost ~]#docker pull c…

永远的福气

你知不知道每个女人最想要的不是一生的美丽美丽会骗了我和你换不到永远的福气你知不知道每个女人最害怕的就是爱人骗自己以为他说的诺言会保证形影不离我碰见你 也看到我最想过的日子因为有你 更了解自己我相信你 却也相信白头到老不能靠运气你是否可以 爱我一生一世发生什么都…

正则表达式(不断更新,欢迎纠错)

匹配中文字符的正则表达式&#xff1a; [u4e00-u9fa5]评注&#xff1a;匹配中文还真是个头疼的事&#xff0c;有了这个表达式就好办了匹配双字节字符(包括汉字在内)&#xff1a;[^x00-xff]评注&#xff1a;可以用来计算字符串的长度&#xff08;一个双字节字符长度计2&#xff…

java 简单数据类型_java基本数据类型

基本数据类型JAVA中一共有八种基本数据类型&#xff0c;他们分别是byte、short、int、long、float、double、char、boolean类型型别字节取值范围byte整型1byte-27 ~ 27-1short整型2byte-215 ~ 215-1int整型4byte-231 ~ 231-1long整型8byte-263 ~ 263-1float浮点型4byte3.402823…

Postgresql日志配置

将PostgreSQL数据库安装后&#xff0c;需要进行一些关于数据库日志的配置&#xff0c;将postgresql.conf文件中&#xff0c;关于日志的配置选项详解&#xff0c;记录如下&#xff1a; 1.logging_collector on/off 是否将日志重定向至文件中&#xff0c;默认是off&#xff08;修…

Win7中IIS7.0安装及ASP环境配置

打开控制面板中“程序”: “程序”中“打开或关闭Windows功能”: 如图&#xff0c;安装IIS7时需要选择要使用的功能模块: IIS7安装完成之后可以在开始菜单的所有程序中看到“管理工具”&#xff0c;其中有一个“Internet信息服务管理器”&#xff0c;如果没有可以按以下步骤…

java 3number_java 数据Number、Math

一个初出茅庐的小子与大家共享一些关于Number和Math的使用&#xff0c;因水平有限&#xff0c;难免有写的不完善的地方&#xff0c;嘻嘻。看完之后&#xff0c;希望可以留下你珍贵的指导意见。The Numbers Classes在写代码的时候&#xff0c;也许会使用到java各种的基本数据类型…

HOG(方向梯度直方图)

结合这周看的论文,我对这周研究的Histogram of oriented gradients(HOG)谈谈自己的理解&#xff1a; HOG descriptors 是应用在计算机视觉和图像处理领域&#xff0c;用于目标检測的特征描写叙述器。这项技术是用来计算局部图像梯度的方向信息的统计值。这样的方法跟边缘方向直…

保留数据给硬盘增加分区

我的块硬盘只有一个分区&#xff0c;里面还有数据&#xff0c;但是想再划分一个区&#xff0c;在win10系统下是这样操作的 首先&#xff0c;我的硬盘的文件系统是fat32&#xff0c;先通过命令提示符把文件系统转换成NTFS&#xff0c;转换前“压缩卷”是灰色的 convert c: /fs:n…

Google Doc API研究之一:模拟页面上传任意类型文件

一直以来想要做个程序&#xff0c;将google doc用作网盘&#xff0c;程序做 的差不多了才发现不是所有的人都可以上传任意类型的文件&#xff0c;只有商业用户才可以。商业用户是要交钱的的&#xff0c;这与我们倡导的免费精神相关太远。怎么办&#xff0c;我的心血 不能白费&a…

java string fill_Java使用fill()数组填充的实现

Arrays 类提供了一个 fill() 方法&#xff0c;可以在指定位置进行数值填充。fill() 方法虽然可以填充数组&#xff0c;但是它的功能有限制&#xff0c;只能使用同一个数值进行填充。语法如下&#xff1a;声明举例&#xff1a;public static void fill(int[] a, form, to, int v…

FL-EM7688 Smart评估板openwrt开发环境搭建(linux固件部分)

搭建前先阅读原厂文档\FL-EM7688 Smart V1.0评估板1资料\文档\FL-EM7688 Smart评估板使用说明.pdf 1.根据FL-EM7688 Smart评估板使用说明.pdf安装好串口调试工具&#xff0c;以及实现通过网线更新固件 2.安装虚拟机&#xff08;版本号12.56&#xff09;和ubuntu-16.04.3-deskto…

小型公司如何管理

一直以来&#xff0c;人们对大型公司的管理都非常称道&#xff0c;对小型公司的管理都认为比较简单。这话说得有一定的道理&#xff0c;毕竟小型公司的人比较少&#xff0c;相对来说&#xff0c;管理的范围和直径比较小一些&#xff0c;能比较有效地执行和监管。但是&#xff0…