4.树

4.1树的定义

树(Tree)是n(n≥0)个结点的有限集,它或为空树(n=0);或为非空树,对于非空树T:

  • (1)有且仅有一个称之为根的结点;
  • (2)除根结点以外的其余结点可分为m (m>0)个互不相交的有限集T1, T2,…,Tm,其中每一个集合本身又是一棵树,并且称为根的子树( SubTree )。

4.2树的基本术语

1.结点: 树中的一个独立单元。包含一个数据元素及若干指向其子树的分支,如中的A、B、C、D等。
2. 结点的度: 结点拥有的子树数称为结点的度。例如,A的度为3,C的度为1,F的度为0。(注:度是n,就产生n条边)
3. 树的度: 树的度是树内各结点度的最大值。上图树的度为3。
4. 叶子: 度为0的结点称为叶子或终端结点。结点K、L、F、G、M、I、J都是树的叶子。
5. 非终端结点: 度不为0的结点称为非终端结点或分支结点。除根结点之外,非终端结点也称为内部结点。
6. 双亲和孩子: 结点的子树的根称为该结点的孩子,相应地,该结点称为孩子的双亲。例如,B的双亲为A,B的孩子有E和F。
7. 兄弟: 同一个双亲的孩子之间互称兄弟。例如,H、Ⅰ和J互为兄弟。
8. 祖先: 从根到该结点所经分支上的所有结点。例如,M的祖先为A、D和H。
9. 子孙: 以某结点为根的子树中的任一结点都称为该结点的子孙。如B的子孙为E、K、L和F。
10. 层次: 结点的层次从根开始定义起,根为第一层,根的孩子为第二层。树中任一结点的层次等于其双亲结点的层次加1。
11. 堂兄弟: 双亲在同一层的结点互为堂兄弟。例如,结点G与E、F、H、I、J互为堂兄弟。
12. 树的深度: 树中结点的最大层次称为树的深度或高度。图所示的树的深度为4。
13. 有序树和无序树: 如果将树中结点的各子树看成从左至右是有次序的(即不能互换),则称该树为有序树,否则称为无序树。在有序树中最左边的子树的根称为第一个孩子,最右边的称为最后一个孩子。
14. 森林: 是m ( m≥0)棵互不相交的树的集合。对树中每个结点而言,其子树的集合即为森林。由此,也可以用森林和树相互递归的定义来描述树。

4.二叉树

为何要研究二叉树:

  • 所有树都能转为唯一对应的二叉树,不失一般性。
  • 普通树(多叉树)若不转化为二叉树,则运算很难实现。
  • 简单,规律性强。

4.1 二叉树的定义

二叉树: 二叉树是n(n≥O)个结点的有限集,它或者是空集(n= 0),或者由一个根结点及两棵互不
相交的分别称作这个根的左子树和右子树的二叉树组成。

二叉树特点:

  1. 每个结点最多有俩孩子 (二叉树中不存在度大于2的结点)。
  2. 子树有左右之分,其次序不能颠倒。
  3. 二叉树可以是空集合,根可以有空的左子树或空的右子树。

注:

  1. 二叉树不是树的特殊情况,它们是两个概念。二叉树结点的子树要区分左子树和右子树,即使只有一棵子树也要区分,说明它是左子树,还是右子树。
  2. 树当结点只有一个孩子时,就无须区分它是左还是右的次序。因此二者是不同的。这是二叉树与树的最主要的差别。


(也就是二叉树每个结点位置或者说次序都是固定的,可以是空,但是不可以说它没有位置,而树的结点位置是相对于别的结点来说的,没有别的结点时,它就无所谓左右了),

4.2二叉树的基本形态

4.3二叉树基本操作

  1. PreOrderTraverse (T)
    初始条件: 二叉树T存在。
    操作结果: 先序遍历T,对每个结点访问一次。
  2. InorderTraverse (T)
    初始条件: 二叉树T存在。
    操作结果 : 中序遍历T,对每个结点访问一次。
  3. PostOrderTraverse (T)
    初始条件: 二叉树T存在。
    操作结果: 后序遍历T,对每个结点访问一次。
  4. CreateBiTree(&T,definition)
    初始条件:definition给出二叉树T的定义。
    操作结果:按definition构造二叉树T。

4.4二叉树的性质

4.4.1 性质1

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

4.4.2 性质2

  • 深度为k的二叉树至多有(2^k )- 1个结点(k ≥1)。

4.4.3 性质3

  • 对任何一棵二叉树T,如果其叶子数为n,度为2的结点数为n2,则n0 = n2+ 1。(n0:叶子节点)
  • 总边数为B = n - 1=n2×2+n1

4.4.3.1 满二叉树

满二叉树: —棵深度为k且有力2^k-1个结点的二叉树称为满二叉树。

特点:

  1. 每一层上的结点数都是最大结点数(即每层都满)。
  2. 叶子节点全部在最底层对满二叉树结点位置进行编号。
  3. 编号规则:从根结点开始,自上而下,自左而右。每一结点位置都有元素。

4.4.3.1 完全二叉树

完全二叉树: 深度为k 的具有n个结点的二叉树,当且仅当其每一个结点都与深度为k的满二叉树中编号为1~n的结点一一对应时,称之为完全二叉树。

下面是不是呢

特点:

  1. 叶子只可能分布在层次最天的两层上。
  2. 对任一结点,如果其右子树的最大层次为i,则其左子树的最大层次必为i或i+1。

4.4.4性质4

具有n个结点的完全二叉树的深度为Llog2n」+ 1 。

注: Lx」:称作x的底,表示不大于x的最大整数

4.4.5 性质5

如果对一棵有n个结点的完全二叉树(深度为Llog2n」+1)的结点按层序编号(从第1层到第Llog2n」+1层,每层从左到右),则对任一结点i (1≤i≤n),有:

  1. 如果i=1,则结点i是二叉树的根,无双亲;
    如果i>1,则其双亲是结点Li / 2」。
  2. 如果2i> n,则结点i为叶子结点,无左孩子;否则,其左孩子是结点2i。
  3. 如果2i+ 1 > n,则结点i无右孩子;否则,其右孩子是结点2i + 1。

4.5二叉树的存储

提要:

方式 顺序 链式
1 一维数组 二叉链表
2 x 三叉链表

4.5.1顺序存储

完全二叉树

非完全二叉树

4.5.2链式存储

4.5.2.1二叉链表

节点构成:

结论:

  • 在n个结点的二叉链表中,有n+1个空指针域。
  • 必有2n个链域。除根结点外,每个结点有且仅有一个双亲,所以只会有n -1个结点的链域存放指针。

4.5.2.2三叉链表

节点构成:


4.6二叉树的遍历

4.6.1主要三种遍历

DLR——先(根)序遍历,
LDR——中(根)序遍历,
LRD——后 (根)序遍历。

先序 中序 后序
(1)访问根结点;(2)先序遍历左子树;(3)先序遍历右子树。 (1)中序遍历左子树;(2)访问根结点;(3)中序遍历右子树。 (1)后序遍历左子树;(2)后序遍历右子树;(3)访问根结点。

例1:三种遍历

答案:先ABELDHMIJ
中ELBAMHIDJ
后LEBMIHJDA

例2:中缀转后缀表达式

先序: - + ax b- c d / e f
中序: a + bx c - d - e / f
后序: a bc d -×+e f / -

前缀表达式,中缀表达式,后缀表达式一一对应先序,中序,后序。

4.6.2 根据遍历序列确定二叉树

由二叉树的先序序列和中序序列,或由二叉树的后序序列和中序序列可以确定唯一一棵二叉树

4.7二叉遍历的具体实现

深度优先遍历(DFS):DLR, LDR, LRD

广度优先遍历(BFS)

4.7.1先序DLR

Status PreOrderTraverse(BiTree T){if(T==NULL)  return OK;//空二叉树else{visit(T);//访问根结点   // // cout<<T->data;PreOrderTraverse(T-> lchild);//递归遍历左子树PreOrderTraverse(T-> rchild);//递归遍历右子树}
}

4.7.2中序LDR

Status InOrderTraverse(BiTree T){if(T==NULL) return OK;//空二叉树else{InOrderTraverse(T->lchild);//递归遍历左子树visit(T);//访问根结点;  // cout<<T->data;InOrderTraverse(T->rchild);//递归遍历右子树}
}

4.7.3后序LRD

Status PostOrderTraverse(BiTree T){//后序if(T==NULL) return OK;else{PostOrderTraverse(T->lchild);PostOrderTraverse(T->rchild);cout<<T->data;}

4.7.4中序遍历的非递归算法

void InOrderTraverse (BiTree T){//中序遍历二叉树T的非递归算法Initstack (S) ; p=T;q=new BiTNode;while(p|| !StackEmpty(S)){if(p)  //p非空{Push(S,p);    //根指针进栈p=p-> lchild;//根指针进栈,遍历左子树}else{         //p为空Pop(S,q);      //退栈cout<<q- >data;    //访问根结点p=q-> rchild;    //遍历右子树}}
}

4.7.5广度优先遍历

层序遍历: 对于一颗二叉树,从根结点开始,按从上到下、从左到右的顺序;访问每一个结点。(注:用队列存储元素)

步骤:

  1. 根节点入队;
  2. 根节点的孩子入队;
  3. 一个根节点出队;
  4. 这个根节点的左右孩子出队。

4.8二叉树的建立

4.8.1先序遍历建立二叉树的二叉链表

void CreateBiTree (BiTree &T )
{//按先序次序输人二叉树中结点的值(一个字符),创建二叉链表表示的二叉树Tcin>>ch;if(ch=='#') T=NULL;//递归结束,建空树else//递归创建二叉树{T=new BiTNode;      //生成根结点T-> data=ch;     //根结点数据域置为chCreateBiTree (T-> lchild) ;//递归创建左子树CreateBiTree (T-> rchild); //递归创建右子树街小}
}

4.8.2复制二叉树

先序遍历的思想

void Copy (BiTree T, BiTree . &NewT){//复制一棵和T完全相同的二叉树if (T==NULL)//如果是空树,递归结束{NewT=NULL;return 0;}else{NewT=new BiTNode;NewT-> data=T-> data;//复制根结点Copy (T-> lchild, NewT-> lchild) ;//递归复制左子树Copy (T-> rchild, NewT-> rchild) ;//递归复制右子树}
}

4.8.3计算二叉树的深度

后序遍历的思想

int Depth(BiTree T)
{//计算二叉树T的深度if (T==NULL) return 0;//如果是空树,深度为0,递归结束else{m=Depth (T->lchi1d) ;//递归计算左子树的深度记为m butol叫_n=Depth (T->rchild) ;//递归计算右子树的深度记为nif (m>n) return (m+1) ;//二叉树的深度为m与n的较大者加1else return (n+1);}
}

4.8.4计算二叉树中节点个数

int NodeCount (BiTree T){//统计二叉树T中结点的个数if (T==NULL) return 0;//如果是空树,则结点个数为0,递归结束else return NodeCount (T->lchild) +NodeCount (T->rchild) +1;//否则结点个数为左子树的结点个数+右子树的结点个数+1
}

4.9线索二叉树

p128

4.树和二叉树——数据结构 (严蔚敏C语言版)相关推荐

  1. 构建线性表的c语言代码,数据结构严蔚敏C语言版—线性表顺序存储结构(顺序表)C语言实现相关代码...

    1.运行环境 这里说明一下这里所有的C语言代码都是基于code::blocks 20.03编译运行的.当然一些其他集成开发环境应该也是可以的,个人不太喜欢功能太过强大的IDE,因为那同样意味着相关设置 ...

  2. 数据结构严蔚敏C语言版—线性表顺序存储结构(顺序表)C语言实现相关代码

    数据结构严蔚敏C语言版-线性表顺序存储结构(顺序表)C语言实现相关代码 1.运行环境 2.准备工作 1)项目构建 1>新建一个SeqList项目 2>新建两个文件Sources和Heade ...

  3. 数据结构之二叉树_二叉排序树(严蔚敏C语言版)

    为什么80%的码农都做不了架构师?>>>    #include <iostream> #include <stdlib.h> #define elemTyp ...

  4. 7.查找——数据结构(严蔚敏 C语言版)

    7.查找 7.1概念 7.1.1查找的分类 查找表可分为两类: 静态查找表: 仅作"查询"(检索) 操作的查找表. 动态查找表: 作"插入"和"删除& ...

  5. 8.排序——数据结构(严蔚敏C语言版)

    8.排序 8.1概念 1.什么是排序? 排序:将一组杂乱无章的数据按一定规律顺次排列起来.即,将无序序列排成一个有序序列(由小到大或由大到小)的运算.如果参加排序的数据结点包含多个数据域,那么排序往往 ...

  6. 数据结构(严蔚敏C语言版)代码实现持续更新中

    文章汇总: 线性表: 线性表的顺序表示和实现 线性表的链式表示和实现 静态链表的表示和实现 栈: 顺序栈--栈的顺序表示和实现 链栈--栈的链式表示和实现 队列: 链队列--队列的链式表示和实现 顺序 ...

  7. 6-5-树的双亲表示法-树和二叉树-第6章-《数据结构》课本源码-严蔚敏吴伟民版...

    课本源码部分 第6章  树和二叉树 - 树的双亲表示法 --<数据结构>-严蔚敏.吴伟民版        源码使用说明  链接☛☛☛ <数据结构-C语言版>(严蔚敏,吴伟民版) ...

  8. 6-2-二叉树(二叉链表存储)-树和二叉树-第6章-《数据结构》课本源码-严蔚敏吴伟民版...

    课本源码部分 第6章  树和二叉树 - 二叉树(二叉链表存储) --<数据结构>-严蔚敏.吴伟民版        源码使用说明  链接☛☛☛ <数据结构-C语言版>(严蔚敏,吴 ...

  9. 11-1-败者树-外部排序-第11章-《数据结构》课本源码-严蔚敏吴伟民版

    课本源码部分 第11章  外部排序 - 败者树 --<数据结构>-严蔚敏.吴伟民版        源码使用说明  链接☛☛☛ <数据结构-C语言版>(严蔚敏,吴伟民版)课本源码 ...

最新文章

  1. 科大星云诗社动态20210529
  2. 下载华为交换机MIB参考文件并使用snmpwalk获取OID信息
  3. SqlServer 添加用户 添加角色 分配权限
  4. 部署windows服务
  5. Sharding-JDBC简介_Sharding-Sphere,Sharding-JDBC分布式_分库分表工作笔记006
  6. zabbix 监控percona
  7. Sql Server 中常用的字符串函数
  8. 【leetcode】中文版题库一刷ing
  9. 若程序员们的“反996协议”实行,会发生什么
  10. 怎么把win10退回win7系统
  11. Qt实战(二)——方块游戏
  12. 微信小程序的技术原理
  13. 源码分析学习记录(11)——半边结构
  14. 量子计算机:决胜21世纪的利器
  15. 安装hadoop 问题记录
  16. java对接支付宝(四)-即时到账无秘退款
  17. 为什么是国际标准化组织是ISO而不是IOS
  18. 实体词典 情感词典_基于词典的文本情感分析(附代码)
  19. SqlServer2005 AMD8450 三核CPU安装Sql Server 2000 SP4 补丁的办法
  20. ASP.NET MVC5(VS 2019)边做边学(01)创建项目控制器与视图的关系

热门文章

  1. Ogitor中Gizmo的绘制技巧
  2. Redis开发设计规范及案例分析
  3. 深度学习的几何观点:1流形分布定律、2学习能力的上限。附顾险峰教授简历(长文慎入,公号回复“深度学习流形分布”可下载PDF资料)
  4. 【spark】RDD-API
  5. IC EMC(集成电路电磁兼容)测试标准介绍
  6. 使用Python获取微信朋友圈的内容
  7. pcb 受潮_高温潮湿对PCB电路板有影响吗?
  8. java常用混淆工具(有链接)
  9. 【信息收集】第六章 社会工程学
  10. 计算机爱好特长范文,【介绍个人性格爱好特长】_自我介绍(特长爱好)概述范文...