数据结构 重点内容简单回顾

本文主要回顾了数据结构中的核心概念,包括线性表、栈和队列、字符串和数组、树与二叉树的遍历、图的遍历算法、查找与排序。详细讲解了链表的创建、栈与队列的特性、二叉树的性质以及各种遍历方法,如前序、中序、后序遍历。此外,还介绍了哈夫曼编码、最小生成树、最短路径算法以及二叉排序树的构建和平衡调整。

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

1.线性表

有 顺序存储 和 链式存储。
其中链式存储时,创建单链表时需要注意两种插入方法 头插法和尾插法

简单说明:

// s为待插入结点,p为待插入结点的前驱结点
// 头插法:
s->next = p->next;
p->next = s;

// 尾插法
p->next = s;
p = s;

注意:能唯一表示链表结点的办法就是它的地址。

2.栈和队列

栈:先进后出,有顺序栈和链栈;
队列:先进先出。

队列需要注意的是循环队列的 队满或队空判断
比如,队列有front指针指向队头的前一位,rear指针指向对尾,入队时队尾指针 rear + 1,出队时队头指针 front - 1;队空时,执行出队, front - 1 ,此时 front == rear队满时,执行入队,rear + 1,此时 rear == front,所以队空与队满判断条件一致了。为了区分队空与队满的判断条件,可以浪费一个位置,这样若 (rear + 1)mod starklength == front(starklength为队列长度),这样就区别了队空与队满的判断。

3.字符串和数组

4.树

树、二叉树 和森林。二叉树与树不同,二叉树有顺序,分左右子树。

(1)树
树的遍历:前序遍历、后序遍历 和 层序遍历。
前序遍历:

  • 一 先访问根结点;
  • 二 再从左到右进行前序遍历。

后序遍历:

  • 一 先从左到右进行后序遍历;
  • 二 再访问根结点。

层序遍历:

  • 从上到下,从左到右,依次访问每个结点。

(2)二叉树
二叉树性质:

  • 二叉树每个结点的度最大为2;
  • 左右子树均为二叉树。

满二叉树性质:

  • 只有度为0和2的结点;
  • 所有叶子结点均在同一层。

完全二叉树性质:

  • 层序遍历时,各结点所对应的序号与其在满二叉树的序号完全相同;
  • 不存在只有右子树,没有左子树的结点;
  • 若存在度为1的结点,那么该结点只有一个,而且该结点只有左子树。

二叉树的遍历:前序遍历、中序遍历 和 后序遍历。
前序遍历:

  • 先访问根结点;
  • 前序遍历左子树;
  • 再前序遍历右子树。

中序遍历:

  • 先中序遍历左子树;
  • 访问根结点;
  • 再中序遍历右子树。

后序遍历:

  • 先后序遍历左子树;
  • 后序遍历右子树;
  • 再访问根结点。

哈弗曼树
带权路径最小的二叉树。
哈夫曼编码:每个结点子树为0子树为1。结点的编码就是从根结点到该结点的路径上对应的0和1顺序。

5.图

图的遍历:深度优先遍历 和 广度优先遍历。

最小生成树:prim算法 和 克里斯卡尔算法。

最短路径:迪杰斯特拉算法 和 弗洛伊德算法。

图的表示:邻接表 和 邻接矩阵。

6.查找

顺序查找、折半查找、树表 和 散列查找

折半查找:

  • 待查找序列前后各两个指针;
  • 取序列中间数与被查数比较;
  • 若小于中间数,则把序列尾指针指向中间数左边第一个值,在中间数左边比较;若大于,则把序列头指针指向中间数右边第一个值,在右边比较;
  • 重复上一步,直到找到或未找到。

树表:
二叉排序树性质

  • 根结点的值大于左子树结点的值,小于右子树结点的值;
  • 左右子树各结点均符合上一条件。

二叉排序树的构建
从待构建序列的第一个值开始,依次访问接下来的值,小的放其左子树,大的放其右子树;左右子树也一样。

二叉排序树的删除调整

  • 被删除结点是叶结点,直接删除;
  • 被删除结点只有左孩子或右孩子,其左右孩子加到其父结点;
  • 被删除结点有左子树或右子树,用左子树最大结点或右子树的最小结点替换被删除结点,再按二叉排序树调整。

平衡二叉树
由于结点的插入顺序随机,故构造二叉排序树时动态调节效率更高。
平衡因子:结点左子树的深度与结点右子树的深度差。
注意:调节的是因为插入结点后,左右子树深度相差大于1的根结点。

LL型

  • 插入位置是根结点左孩子的左子树上,此时导致根结点的平衡因子为2。
  • 根据“扁担原理”,顺时针旋转,把根结点变为其左孩子的右孩子,此时根结点会与其左孩子的右子树冲突,按照旋转优先原则,把左孩子的右子树加到根结点的左子树,即可。

RR型

  • 插入位置是根结点右孩子的右子树上,此时导致根结点的平衡因子为-2。
  • 根据“扁担原理”,逆时针旋转,把根结点变为其右孩子的左孩子,此时根结点会与其右孩子的左子树冲突,按照旋转优先原则,把右孩子的左子树加到根结点的右子树,即可

LR型

  • 插入位置是根结点左孩子的右子树上,此时导致根结点的平衡因子为2。
  • 先保持根结点不动,先调整其左子树。
  • 第一次旋转,此时的根结点为左子树根结点,根据“扁担原理”,逆时针旋转,把根结点变为其右孩子的左孩子,此时根结点会与其右孩子的左子树冲突,按照旋转优先原则,把右孩子的左子树加到根结点的右子树;
  • 第二次旋转,调整整个最小不平衡树,根据“扁担原理”,顺时针旋转,把根结点变为其左孩子的右孩子,此时根结点会与其左孩子的右子树冲突,按照旋转优先原则,把左孩子的右子树加到根结点的左子树,即可。

RL型

  • 插入位置是根结点右孩子的左子树上,此时导致根结点的平衡因子为-2。
  • 先保持根结点不动,先调整其右子树。
  • 第一次旋转,此时的根结点为右子树根结点,根据“扁担原理”,顺时针旋转,把根结点变为其左孩子的右孩子,此时根结点会与其左孩子的右子树冲突,按照旋转优先原则,把左孩子的右子树加到根结点的左子树;
  • 第二次旋转,调整整个最小不平衡树,根据“扁担原理”,逆时针旋转,把根结点变为其右孩子的左孩子,此时根结点会与其右孩子的左子树冲突,按照旋转优先原则,把右孩子的左子树加到根结点的右子树,即可。

散列查找
线性探测法,构造散列表

7.排序

插入排序:直接插入排序、希尔排序
直接插入排序:把待排序列分为有序区和无序区,依次把无序区的数加到有序区的合适位置。
希尔排序:把待排序列分为若干子序列,进行直接插入排序,待整个待排序列基本有序,再对整个序列做一次直接插入排序。
注意:希尔排序是直接插入排序的改进,因为直接插入排序在待排序列基本有序时,效率很高。

交换排序:冒泡排序、快速排序
冒泡排序:

  • 从待排序列的第一个数开始,依次与下一个数比较大小,小于则以下一个数为开始继续向下比较,大于则与下一个数交换位置继续向下比较,最后产生一个最大数,加入有序区。
  • 重复上一步骤。

快速排序:

  • 待排序列,前后各一个指针。
  • 从右侧开始,比较指针指向的两个数,若前者小于后者,则后者的指针前移一位;若大于,则交换两指针的值,开始从左侧开始,前者指针后移一位,继续比较两指针指向数的大小;
  • 一次排序之后,会产生左右两个子序列,再对左右两个子序列进行快速排序。
    注意:快速排序为冒泡排序的改进版。

选择排序:简单选择排序
简单选择排序:

  • 初始一个空的有序区,以待排序列为无序区;
  • 从无序区选择一个最小的数加入有序区;
  • 不断重复上一条件。

归并排序:二路归并排序
二路归并排序:

  • 把待排序列分成若干只有两个数的子序列,并在各子序列内排序;
  • 把上一步的若干子序列,两两一组,再排序;
  • 不断两两一组,直到子序列包含所有待排序列的数。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值