数据结构-树和二叉树

本文详细介绍了树的逻辑结构,包括树的定义、基本术语、抽象数据类型定义,以及各种遍历方式。此外,还深入讨论了二叉树的特性,如特殊类型、遍历操作和存储结构,最后提到了哈夫曼编码和线索二叉树等相关概念。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

一、树的逻辑结构
1、树的定义采用递归方法
2、树的基本术语:
①结点的度:结点所拥有的子树的个数
②树的度:树中各结点度的最大值
③叶子结点:度为0的结点(终端结点)
④分支结点:度不为0的结点(非终端结点)
⑤结点所在层数和高度

在这里插入图片描述
⑥层序编号:(从上到下,从左到右)
⑦有序树、无序树:如果一颗树中结点的各子树从左到右是有次序的,称这棵树为有序树;反之为无序树
⑧森林:m(m≥0)棵互不相交的树的集合
⑨同构:对两棵树,若通过对结点适当地重命名,就可以使这两棵树完全相等(结点对应相等,结点对应关系也相等)
3、树的抽象数据类型定义
ADT Tree
Data
树是由一个根结点和若干棵子树构成
树中结点具有相同数据类型及层次关系
Operation
InitTree
前置条件:树不存在
输入:无
功能:初始化一棵树
输出:无
后置条件:构造一个空树
DestroyTree
前置条件:树已存在
输入:无
功能:求树的根结点
输出:树的根结点的信息
后置条件:树保持不变、
Parent
前置条件:树已存在
输入:结点x
功能:求结点x的双亲
输出:结点x的双亲信息
后置条件:树保持不变
Depth
前置条件:树已存在
输入:无
功能:求树的深度
输出:树的深度
后置条件:树保持不变
PreOrder
前置条件:树已存在
输入:无
功能:前序遍历树
输出:树的前序遍历序列
后置条件:树保持不变
PostOrder
前置条件:树已存在
输入:无
功能:后序遍历树
输出:树的后序遍历序列
后置条件:树保持不变
endADT
4、树的便利操作:
①前序遍历:从左到右
②后序遍历:从左到右
③层序遍历:自上而下,从左到右
5、双亲表示法中结点数据类型的定义
template
struct PNode{
T data;//数据域
int parent;//指针域,双亲在数组中的下标
}
6、孩子表示法-多重链表表示法(节点中的指针域表示孩子
①指针域的个数等于树的度
②指针域的个数等于该结点的度
③孩子节点:
struct CTNode
{
int child;
CTNode *next;
};
表头节点:
template
struct CBNode
{
T data;
CTNode *firstchild;
};
7、孩子兄弟表示法
template
struct TNode{
T data;
TNode*firstchild,*rightsid;
};
二、二叉树的逻辑结构
1、特点:
每个节点最多有两棵子树
二叉树是有序的,其次序不能任意颠倒
二叉树和树是两种树结构
2、特殊二叉树
左斜树、右斜树(斜树-每一层只有一个节点,结点个数与其深度相同
满二叉树
完全二叉树
3、完全二叉树的性质
在完全二叉树中,结点的层序编号反映了结点之间的逻辑关系
三、二叉树的遍历操作
①前序(根)遍历
访问根节点
前序遍历根节点的左子树
前序遍历根节点的右子树
②中序(根)遍历
中序遍历根结点的左子树
访问根节点
中序遍历根节点的右子树
③后序(根)遍历
后序遍历根结点的左子树
后序遍历根节点的右子树
访问根节点
四、二叉树的存储结构及实现
二叉树的顺序存储结构就是用一维数组存储二叉树中的节点,并且节点的存储位置应能体现节点之间的逻辑关系——父子关系
完全二叉树和满二叉树中的节点的序号可以唯一的反映出节点之间的逻辑关系
五、二叉链表
template
struct BiNode
{
T data;
BiNode*Ichild,*rchild;
六、非递归前序遍历二叉树
1、栈是实现递归的最常用的结构
2、二叉树的建立:
按扩展前序遍历序列输入结点的值
如果输入介电质为#,则建立一棵空的子树
否则,根结点申请空间,将输入值写入数据域中
以相同方法的创建根结点的左子树
以相同的方法创建根节点的右子树
七、非递归中序遍历二叉树
遇到一个节点,就把他推入栈中,并取遍历他的左子树
遍历完左子树后,从栈顶托出这个结点并访问之,然后按照他的右链接指示的地址再去遍历该节点的右子树
八、后序遍历——递归算法
非递归后序遍历二叉树
①访问当前节点p
②如果栈空,算法结束
③否则,栈顶元素出栈,转查看p的标志,如果标志为right,进行下面的工作
④否则修改p的标志,让p重新入栈,p=p->rchild
执行
九、非递归遍历总结
前序:每个节点只进栈一次,在进栈前访问节点
中序:每个节点进栈一次,在出栈是访问节点
后序:每个节点进栈两次,在第二次出栈时访问几点
十、计算树的高度
1、高度的定义:max(左子树高度,右子树高度)+1
算法分析:
从根节点出发开始计算
如果root==NULL,高度为0;
否则,分别计算左子树高度;右子树高度;返回max(左子树高度,右子树高度)+1
2、输出中缀表达式
(a+(b×(c-d)))-(e/f)
基本思想:
中序遍历左子树前,输出左括号
中序遍历右子树前,输出右括号
十二、叉树转化为森林
加线、去线、层次调整
十二、哈夫曼编码
十三、线索二叉树
在这里插入图片描述

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值