day_02_链表、二叉树
来源:互联网 发布:windows无权访问 编辑:程序博客网 时间:2024/05/21 17:04
- 四链表的基本概念和操作List
- 1基本分类
- 2基本操作
- 五二叉树的基本概念和操作BinaryTree
- 1基本概念
- 1二叉树
- 2满二叉树
- 3完全二叉树
- 2基本特征
- 3存储结构
- 4基本操作
- 5遍历方式
- 1基本概念
- 四链表的基本概念和操作List
四、链表的基本概念和操作(List)
1、基本分类
1)单向线性链表:
每个节点中除了存储数据元素本身之外,还需要保存下一个节点地址的指针,叫做后指针;其中尾节点的后指针是空指针;
2)单向循环链表
与单向线性链表类似,所不同的是让尾节点的后指针指向了头节点,首尾相接构成环状结构;
3)双向线性链表
每个节点中除了存储数据元素本身之外,还需要保存下一个节点的地址(后指针)和上一个节点的地址(前指针);
注意:头节点的前指针和尾节点的后指针都是空指针;
4)双向循环链表:
与双向线性链表类似,所不同的是让尾节点的后指针指向头节点,头节点的前指针指向尾节点,首尾相接构成环状结构;
5)数组链表:
链表中的每一个元素都是一个数组,也就是由数组构成的链表叫做数组链表。
6)链表数组
字符数组 - 数组中的每一个元素都是字符;
指针数组 - 数组中的每一个元素都是指针;
链表数组 - 数组中的每一个元素都是链表;
7)二维链表
二维数组 - 数组中每一个元素都是一个一维数组;
二维链表 - 链表中每一个元素都是一个一维链表;
2、基本操作
- 实现向链表开头位置插入新节点 - - - - - - - -
list_push_head()
- 实现向链表末尾位置插入新节点 - - - - - - - -
list_push_tail()
- 实现向指定位置插入新节点 - - - - - - - - - - - -
list_push_pos()
- 遍历链表中的所有节点 - - - - - - - - - - - - - - - -
list_travel()
- 实现删除链表中的头节点 - - - - - - - - - - - - - -
list_pop_head()
- 实现删除链表中的尾节点 - - - - - - - - - - - - - -
list_pop_tail()
- 实现删除指定下标位置的节点 - - - - - - - - - -
list_pop_pos()
用途:
主要用于需要进行大量增删操作的场合中;
扩展:
a.实现判断链表是否为空/为满;
b.实现计算链表中有效元素的个数;
c.实现查看头节点的元素值;
d.实现查看尾节点的元素值;
e.实现查看中间节点的元素值;
f.实现逆转链表中的所有节点前后顺序(重点);
g.实现两个有序单链表的合并,结果依然是有序链表;
… …
五、二叉树的基本概念和操作(BinaryTree)
1、基本概念
1)二叉树
二叉树就是指每个节点最多有两个子节点的树型结构;
根节点、枝节点、叶子节点、左(右)子节点、大小(节点个数)
2)满二叉树
如果二叉树中每层节点的个数都达到了最大值,并且所有枝节点都有两个子节点,这样的二叉树叫做满二叉树。
3)完全二叉树
如果该二叉树中除了最下面一层外,其他各层的节点数都达到了最大值,并且最下面一层的节点都连续集中在左边,这样的二叉树叫做完全二叉树。
注意:
栈/队列/链表属于逻辑结构中的线性结构;二叉树属于逻辑结构中的树形结构;
2、基本特征
二叉树具有递归嵌套式的空间结构特征,因此采用递归的方法处理二叉树,常常可以使得算法更加简洁,具体的处理方式如下:
处理(二叉树){ if(二叉树为空) 直接处理; else { 处理左子树;=> 递归 (以根节点的左子节点为根节点的小二叉树) 处理右子树;=> 递归 (以根节点的右子节点为根节点的小二叉树) 处理根节点; }}
3、存储结构
1)采用顺序结构存储二叉树
一般来说,采用从上到下,从左到右依次存放节点的方式,对于非完全二叉树来说需要使用虚节点占位;
2)采用链式结构存储二叉树
每个节点中有三个成员:其中一个用于记录数据元素本身,另外一个用于记录左子节点的地址,最后一个用与记录右子节点的地址;
例:
typedef struct node{ int data; //记录数据元素本身 struct node* left; //记录左子节点的地址 struct node* right; //记录右子节点的地址} Node;
4、基本操作
- 创建 - - - - - - - - - - - - - - -
binary_tree_create()
- 销毁 - - - - - - - - - - - - - - -
binary_tree_destroy()
- 判断是否为空 - - - - - - - -
binary_tree_empty()
- 判断是否为满 - - - - - - - -
binary_tree_full()
- 插入元素 - - - - - - - - - - –
binary_tree_insert()
- 遍历所有元素 - - - - - - - -
binary_tree_travel()
- 查找元素 - - - - - - - - - - –
binary_tree_find()
- 删除元素 - - - - - - - - - - - -
binary_tree_delete()
- 修改元素 - - - - - - - - - - - -
binary_tree_modify()
- 获取根节点元素 - - - - - -
binary_tree_root()
- 计算中元素个数 - - - - - -
binary_tree_size()
5、遍历方式
1)先序遍历(DLR => data left right)
遍历根节点 => 遍历左子树 => 遍历右子树 又叫先根遍历;
2) 中序遍历(LDR => left data right)
遍历左子树 => 遍历根节点 => 遍历右子树 又叫中根遍历;
3)后序遍历(LRD => left right data)
遍历左子树 => 遍历右子树 => 遍历根节点 又叫后根遍历;
注意:有序二叉树(满足三个条件)
a. 若左子树非空,则左子树上的所有节点元素值都小于等于根节点元素值;
b. 若右子树非空,则右子树上的所有节点元素值都大于等于根节点元素值;
c. 左右子树内部也分别满足以上特征;
功能:有序二叉树主要用于排序和查找的场合中,又叫做查找二叉树。
练习:
- day_02_链表、二叉树
- day_02_静态库与共享库
- day_02_布尔、函数重载、内存分配、引用
- Day_02_数据库的简单连接和添加数据
- day_02_信号和槽、容器窗口、面向对象
- 二叉树 => 链表
- 二叉树 链表 + RSA
- 二叉树(链表)
- 链表 二叉树
- 二叉树、二叉堆
- 链表、队列、二叉树结构
- 链表,二叉树,哈希表,数组
- 数据结构之二叉树(链表)
- 二叉树
- 二叉树
- 二叉树
- 二叉树
- 二叉树
- R
- javascript基础(三) 个人笔记
- Matlab编程的GPU加速
- jmeter正则表达式提取器里正则表达式语法简介(一)
- mysql中utf8和utf8mb4区别
- day_02_链表、二叉树
- Python爬虫基础实战——用爬虫来自动翻译英文文档
- ARM NEON编译优化
- 装逼文本编辑器Atom + activate-power-mode插件
- std::mutex
- 自考—《信息系统开发与管理》
- 【并查集&路径压缩 模板】
- MyBatis 3.3.1 批量插入多行回写自增id
- redis配置数据库数量