数据结构 - B站郝斌
# 别人整理的地址 https://www.cnblogs.com/flmei/p/10768617.html # 1. 数据结构和算法 ``` 1. 数据结构:我们如何把现实中大量而复杂的问题以特定的数据类型和特定的存储结构保存到主存储器(内内存)中 2. 算法:对数据结构存储的数据进行操作(比如查找,删除,排序等) 衡量算法的标准 1. 时间复杂度,大概要执行的次数 2. 空间复杂度,执行中大概所占最大内存 3. 可读性 4. 健壮性 ``` # 2. 预备知识 ``` 1. 指针 地址:内存单元的编号,从0开始的非负整数,范围0 - 4G-1 指针就是地址,地址就是指针 指针变量是存放内存单元地址的变量 指针变量只能存放内存单元地址 普通变量之前不能加* 常量表达式前不能加& 指针的本质是一个操作受限的非负整数 2. 结构体 用户根据实际需要自己定义的复合数据类型 在C语言汇总,传输一个变量的值要比传输该变量的内存地址(只占4个字节)占用内存大,更浪费时间 3. 动态内存的分配和释放 ``` ![指针](C:\Users\Administrator\Desktop\指针.png) # 3. 链表 ``` 定义: 1.1 n个节点离散分配,彼此通过指针相连,每个节点只有一个前驱节点和一个后续节点,首节点没有 前 驱,尾结点没有后续 多个结构体相连接(结构体有两个部分,一个是数据域,一个是指针域,指针域存放下个节点的地址) 1.2 专业术语: 首节点:第一个有效的节点 尾节点:最后一个有效的节点 头节点:在首节点再加一个没有实际含义的节点(没有实际数据,为了方便计算) 头节点的数据类型和整个链表的其他类型一致 头指针:指向头节点的指针变量 尾指针:指向尾节点的指针变量 1.3 确定一个链表需要的参数 一个参数:头指针(其他信息全部可以通过此参数确定) 插入和删除 1. 修改链表某些节点的指针域的前后节点对应,删除的时候注意释放内存 判断链表是否为空 判断头节点的指针域是否为空,为空则链表是空 求链表长度 从头节点开始,根据指针域找下一个节点,以此循环,进行计数 ``` # 栈 ``` 定义 一种可以先进后出的存储结构 类似于对一个链表进行操作,链表的头指针为栈的底部,尾指针为栈的顶部,然后按照只能从顶部进行操作的原则对其进行操作 分类 静态栈 动态栈 算法 压栈(入栈) 出栈 应用 函数调用,调用A时,把A入栈,A里面有调用B,然后把B用到的相关变量等入栈,函数调用完成之后,在栈中就能找到需要执行语句的地址 ``` # 队列 ``` 定义 先进先出的存储结构 分类 链式队列 用链表实现的 静态队列 用数组实现 算法 应用 ``` # 线型结构与非线型结构 ``` 线型结构 通过数组和链表实现 栈和队列是通过数组或链表实现的 非线型结构 树 图 ``` # 树 ``` 定义 专业定义: 1. 有且只有一个称为根的节点 2. 有若干个互不相交的子树,这些子树本身也是一棵树 通俗的定义: 1. 数是由节点和边组成,边是指针域 2. 没一个节点只能有一个父节点,有多个子节点 3. 根节点没有父节点 专业术语 子节点,父节点 子孙,堂兄弟 深度 从跟节点到最底层节点的层数称为深度 根节点是第一层 叶子节点 没有子节点的节点 非终端节点 实际就是非叶子节点 度 子节点的个数 分类 一般树 任意一个节点的子节点的个数不受限制 二叉树 任意一个节点的子节点的个数最多是2个,且子节点的位置不可更改 再分类: 1. 一般二叉树 2. 满二叉树 一棵二叉树的结点要么是叶子结点,要么它有两个子结点 如果一个二叉树的层数为K,且结点总数是(2^k) -1,则它就是满二叉树 3. 完全二叉树 如果只是删除了满二叉树最底层最右边的连续若干个节点,形成的二叉树就是完全二叉树 满二叉树是完全二叉树的一个特例 森林 n个互不相交的树的集合 树的存储: 1. 二叉树的存储 连续存储(完全二叉树): 优点: 查找某个节点的父节点和子节点很快 缺点: 占用内存空间很大 链式存储(内存占用较少) 每个节点分为三块区域:数据域,左子节点指针域,右子节点指针域 2. 一般树的存储 一般先转换成二叉树进行计算 转换方法: 左指针域指向他的第一个孩子 右指针域指向他的下一个兄弟 3. 森立的存储 从每个树的根节点开始,将各个根节点视为兄弟节点,然后再按照一般树的方式进行转换 操作 遍历 先序遍历 先序:对于当前节点,先输出该节点,然后输出他的左孩子,最后输出他的右孩子 1. 先访问根节点 2. 再先序访问左子树 把当前节点看做根节点,重复1,2,3 3. 再先序访问右子树 把当前节点看做根节点,重复1,2,3 中序遍历 中序:对于当前结点,先输出它的左孩子,然后输出该结点,最后输出它的右孩子 1. 中序遍历左子树 2. 访问根节点 3. 中序遍历右子树 后序遍历 后序:对于当前结点,先输出它的左孩子,然后输出它的右孩子,最后输出该结点 步骤与先序,中序类似 已知两种遍历序列,求原始二叉树 1. 先序+中序可以还原原始二叉树 2. 中序+后序可以还原原始二叉树 3. 先序+后序无法还原原始二叉树 应用 1. 树是数据库中数据组织的一种重要形式 2. 操作系统子父进程的关系也是一棵树 3. 面向对象的继承关系也是一棵树 ```