作为新手学习数据结构的学习笔记,仅为自用,欢迎交流,不喜勿喷哦
前言
本文主要是针对数据结构知识点的总结,方便后续的回顾。
1.数组
数组是一种常见的数据结构,用于存储相同类型的数据项。
- 数组是由相同类型的元素组成的有序集合;
- 数组的每个元素都有一个唯一的索引(通常从0开始),用于标识该元素在数组中的位置;
- 数组的大小在创建时就确定,并且通常是固定的,尽管某些编程语言允许动态调整数组大小。
2.链表
链表是一种基本的线性数据结构,它由一系列节点组成,每个节点包含数据和指向下一个节点的引用。
- 链表是由节点组成的数据结构,每个节点包含数据以及指向下一个节点的引用(指针或链接);
- 链表中的节点在内存中不一定是连续存储的,相邻节点通过指针连接;
- 链表通常由头节点(指向链表的第一个节点)和尾节点(指向链表的最后一个节点)来定义。
链表的分类
- 单向链表:每个节点只有一个指针,指向下一个节点;
- 双向链表:每个节点有两个指针,分别指向前一个节点和后一个节点,这样可以双向遍历链表;
- 循环链表:链表的尾节点指向头节点,形成一个闭环。循环链表可以是单向的或双向的。
3.数组和链表的区别
- 存储方式:
数组:数组在内存中是连续存储的,所有元素的地址在内存中是紧邻着的。
链表:链表中的节点在内存中不一定是连续存储的,每个节点都有指向下一个节点的指针,因此节点可以分散在内存中的任何位置。
- 大小调整:
数组:数组的大小通常是固定的,一旦分配了内存空间,其大小就无法动态调整。
链表:链表的大小可以动态增长或缩小,可以根据需要动态地分配或释放内存空间。
- 插入和删除操作:
数组:在数组中插入或删除元素通常需要移动其他元素,特别是在中间或开头位置,这可能导致较高的时间复杂度,最坏情况下为O(n)。
链表:在链表中插入或删除元素通常只需要调整节点的指针,不需要移动其他节点,因此这些操作的时间复杂度是常数时间,即O(1)。
4.栈
- 定义:
栈是一种线性数据结构,它是一系列元素的集合,具有后进先出的特点。这意味着最后入栈的元素最先出栈,而最先入栈的元素最后出栈。
- 结构特点:
栈通常由数组或链表实现。
栈具有一个指向栈顶的指针,指示当前栈顶元素的位置。
栈的操作主要包括入栈(push)和出栈(pop)两种基本操作。
- 基本操作:
入栈(push):将元素压入栈顶,栈的大小加一。
出栈(pop):将栈顶元素移出栈,并返回该元素,同时栈的大小减一。
5.队列
- 定义:
队列是一种线性数据结构,类似于现实生活中排队的概念。它是一个元素的集合,具有先进先出的特点,即最先进队列的元素最先出队列。
- 结构特点:
队列通常由数组或链表实现。
队列有两个指针,一个指向队头,用于出队列操作,另一个指向队尾,用于入队列操作。
入队列操作(enqueue)是在队尾添加元素,出队列操作(dequeue)是从队头移除元素。
- 基本操作:
入队列(enqueue):将元素添加到队列的末尾。
出队列(dequeue):从队列的头部移除并返回元素。
查看队头元素(peek):查看队列头部的元素,但不移除它。
6.栈和队列的区别
- 元素进出顺序:
栈:采用后进先出的方式,最后入栈的元素最先出栈,类似于一摞盘子,取盘子时总是取最上面的。
队列:采用先进先出的方式,最先入队列的元素最先出队列,类似于排队等候服务的顾客,先来的先被服务。
- 基本操作:
栈:主要操作包括入栈(push)和出栈(pop)。
队列:主要操作包括入队列(enqueue)和出队列(dequeue)。
- 实现方式:
栈可以用数组或链表实现,常见的实现方式有数组模拟栈和链式栈。
队列也可以用数组或链表实现,常见的实现方式有数组模拟队列和链式队列。
7.二叉树
- 定义:
二叉树是一种树形结构,每个节点最多有两个子节点,分别称为左子节点和右子节点。
二叉树的子节点的顺序是有意义的,通常称为左子树和右子树。
- 特点:
每个节点最多有两个子节点,分别称为左子节点和右子节点。
左子树和右子树也是二叉树,可以为空(即节点没有子节点)。
二叉树的节点可以包含额外的信息,如值、指针等。
二叉树的节点具有递归结构,即每个节点都可以看作是根节点,其左右子节点也分别是左右子树的根节点。
- 分类:
满二叉树:除了叶子节点外,每个节点都有两个子节点的二叉树。
完全二叉树:除了最后一层外,每一层都被完全填满,且最后一层从左到右填入,缺失的位置都集中在树的右侧。
平衡二叉树:每个节点的左子树和右子树的高度差不超过1。
二叉搜索树:一种有序的二叉树,对于每个节点,其左子树的所有节点值都小于该节点的值,而右子树的所有节点值都大于该节点的值。
线索二叉树:对普通二叉树的叶子节点进行特殊的处理,使得每个节点都含有一个额外的指针,指向该节点在某种遍历顺序下的前驱或后继节点。
哈夫曼树:一种特殊的二叉树,用于数据压缩,树中的叶子节点对应着待压缩的字符,而非叶子节点对应着字符的编码。
二叉堆:一种特殊的完全二叉树,满足堆的性质,常用于实现优先队列等数据结构。
- 存储方式:
链式存储:存储依靠指针将各个节点串联起来,不需要连续的存储空间。
顺序存储:利用数组进行存储,数组中的每一个位置仅存储节点的 data,不存储左右子节点的指针,子节点的索引通过数组下标完成。
- 遍历方式:
前序遍历:首先访问根节点,然后递归地前序遍历左子树,最后递归地前序遍历右子树。
中序遍历:先递归地中序遍历左子树,然后访问根节点,最后递归地中序遍历右子树。
后序遍历:先递归地后序遍历左子树,然后递归地后序遍历右子树,最后访问根节点。
总结
以上是今天要讲的内容。本文仅仅简要介绍了数据结构的一些基础知识点,详细的内容需要在后续深入学习和探索。