数据结构
和平精英总指挥
学材料的柱子
展开
-
生成最大窗口数组
题目:有一个整型数组 arr 和一个大小为 w 的窗口从数组的最左边滑倒最右边,窗口每次向右边划一个位置。例如:数组为 [4,3,5,4,3,3,6,7],窗口大小为3时:[4 3 5] 4 3 3 6 7 窗口的最大值为54[3 5 4] 3 3 6 7 窗口的最大值为54 3[5 4 3] 3 6 7 窗口的最大值为54 3 5[4 3 3] 6 7 窗口的最大值为44 3 5...原创 2020-04-16 11:23:27 · 174 阅读 · 0 评论 -
拓扑排序
针对的是有向无环图,且一定要为有向无环图,总体思路为:找到入度为0的点从图中去除以改点为弧尾的弧,循环到步骤1.原创 2020-04-01 21:57:53 · 79 阅读 · 0 评论 -
深度优先生成树和广度优先生成树
生成树详细介绍关键:检测是否是第一次访问,是 则指向左孩子 不是则指向兄弟void MGraph::DFSTree(int i, CSTree&T){ //将正在访问的该顶点的标志位设为true visited[i] = true; bool first = true; CSTree q = NULL; //依次遍历该顶点的所有邻接点 for (int w = FirstA...原创 2020-04-01 21:11:27 · 2694 阅读 · 1 评论 -
深度优先搜索DFS和广度优先搜索BFS
DFS详细介绍DFS——不断回溯的过程。类似于树的先序遍历,从任一未被遍历过的点开始,将改点标记为visited,然后去找改点连通的点,如果没有被遍历则标记为visited,然后继续探索。。。。当没有可以探索的点时,则回溯到上一个点。以上图为例,遍历过程为:v1 v2 v4 v 8 v 5 v3 v6 v7注意:DFS结果不是唯一的,看自己是如何设定的,以下也可以使DFS遍历的结果v1...原创 2020-04-01 20:51:46 · 155 阅读 · 0 评论 -
最小生成树——克鲁斯卡尔算法(Kruskal算法)
克鲁斯卡尔算法(Kruskal算法)对于n个顶点的连通图而言,其生成的最小生成树有n-1条边,即可以保证从任一点出发可以到达任一点且不产生回路。克鲁斯卡尔算法(Kruskal算法):对每条边的权值进行从小到大排序,然后从小到大取权值最小的边,如取出的边会在树中产生回路则舍去,取下一条;若不会产生回路则加入到树中。因此Kruskal算法的关键问题就是:如何判断新加入的边是否会产生回路。判断是...原创 2020-03-30 17:03:02 · 4356 阅读 · 0 评论 -
最小生成树——普里姆算法(Prim算法)
普里姆算法:普里姆算法在找最小生成树时,将顶点分为两类,一类是在查找的过程中已经包含在树中的(假设为 A 类),剩下的是另一类(假设为 B 类)。对于给定的连通网,起始状态全部顶点都归为 B 类。在找最小生成树时,选定任意一个顶点作为起始点,并将之从 B 类移至 A 类;然后找出 B 类中到 A 类中的顶点之间权值最小的顶点,将之从 B 类移至 A 类,如此重复,直到 B 类中没有顶点为止。所...原创 2020-03-30 16:40:51 · 7274 阅读 · 1 评论 -
二叉树非递归(迭代)方法遍历
二叉树非递归(迭代)方法遍历前序遍历运用栈来实现二叉树的前序遍历while(栈不为空或结点不为空){1.若结点不为空(从根结点开始) 入栈 打印2.while(根的左儿子不为空) 入栈 打印3.if(根的左儿子为空 )记录栈顶结点top 出栈 判断top的右儿子若top的右儿子为空 继续出栈 判断下一个top的右儿子若top的右儿子不为空 返回第一步}出栈的顺序和中序...原创 2019-09-07 15:51:45 · 150 阅读 · 0 评论 -
排序
直接排序方法:把待排序的记录按其关键码值的大小逐个插入到一个已经排好序的有序序列中,直到所有的记录插入完为止,得到一个新的有序序列应用场景 :接近有序 数据量较少接近有序:小的元素在前 大的在后 不大不小的在中间空间复杂度:O( 1) 不需要额外的空间时间复制度:O(n^2) 最坏情况下 为:1+2+3+4········+n稳定性:稳定(稳定性的定义: 假定在待排序的记...原创 2019-09-10 22:07:15 · 129 阅读 · 0 评论 -
根据中序遍历和后序遍历构建二叉树
根据中序遍历和后序遍历构建二叉树同根据前序遍历和中序遍历构建二叉树 先确定二叉树找根结点: 后序的最后一个为根结点1 在中序中找到1 中序中 1前面的对应根结点1的左子树 一共三个结点在后序中前三个结点4 5 2 为1的左子树后序遍历结果 确定 2 为1的左儿子同理中序中 6 3 8 7 为1的右子树的前序遍历结果后序中6 8 7 3 为1的右子树的后序遍历结果Node* Buil...原创 2019-09-07 14:59:23 · 1604 阅读 · 0 评论 -
根据前序遍历和中序遍历构建二叉树
根据前序遍历和中序遍历构建二叉树通过前序遍历和中序遍历 可以确定二叉树 (中+后也可以 ,但前+后不行)从而构建二叉树通过前序遍历和中序遍历确定二叉树Tip:以1为结点的前序遍历是 1 2 4 5 3 6 7 8 中序:4 2 5 1 6 3 8 7以2为结点的前序: 2 4 5 中序 :4 2 5以3为结点的前序: 3 6 7 8 中序: 6 3 8 7 以上图为例子:由前...原创 2019-09-07 14:42:44 · 1087 阅读 · 0 评论 -
用队列来实现二叉树的层序遍历
以下图为例:左边表示二叉树 右边表示队列实现方法:将根结点放入队列while(只要队列不为空){打印队列中第一个结点 在二叉树中找到这个结点 并将这个结点的左右孩子放在队列末尾 删除这个结点}#include<stdio.h>#include<stdlib.h>#include<assert.h>#include<string....原创 2019-09-03 23:10:20 · 1129 阅读 · 0 评论 -
寻找二叉树中两个结点的最近公共祖先
Node* FindNode(Node*root,Node*p){ if (root == NULL) return NULL; if (root == p) return root; if (FindNode(root->left, p)) return FindNode(root->left, p); return FindNode(root->righ...原创 2019-09-03 16:43:44 · 1591 阅读 · 0 评论 -
根据前序遍历和 '#' 来建立二叉树
仅仅根据前序遍历是不能确实二叉树的 但是用’#‘来表示空 即可确定二叉树上图用前序遍历和’#’ 表示的唯一结果为: A B D # # E # H # # C F # # Gtypedef struct Result{ Node *root; int used;}Result;Result CreatTree(char pre[], int size){ if (siz...原创 2019-09-03 15:52:35 · 367 阅读 · 0 评论 -
二叉树常用接口
二叉树问题用递归来解决时 是从叶子结点 往根的方向 从下往上来实现的求结点个数关系:总结点个数 = 根 + 左子树结点个数 + 右子树结点 个数终止条件: root == NULL;int size(Node*root){ if (root == NULL) return 0; int left = size(root->left); int right = size...原创 2019-09-03 15:03:14 · 157 阅读 · 0 评论 -
二叉树的遍历
二叉树的特点:每个结点最多有两棵子树,即二叉树不存在度大于2的结点。二叉树的子树有左右之分,其子树的次序不能颠倒。三种遍历方式前序遍历根 左子树 右子树1.从A开始 先访问A2.访问A的左子树 B B既代表A的子节点 同时代表A的左子树 访问B在访问B时 把B当成根 访问B的左右子树3.访问B的左子树 D 同样 把D当成根 访问D的左右子树4.访问D的左子...原创 2019-09-02 16:10:41 · 107 阅读 · 0 评论 -
堆
定义堆 :一种特殊的完全二叉树,若堆的根结点小于左儿子和右儿子,且他的左子树和右子树同样满足这一条件则称作小堆若堆的根结点大于左儿子和右儿子,且他的左子树和右子树同样满足这一条件则称作大堆二叉树的顺序存储堆中的元素以顺序存储的方式存储,顺序结构存储就是使用数组来存储,一般使用数组只适合表示完全二叉树,因为不是完全二叉树会有空间的浪费。完全二叉树顺序存储如上图所示,下标0到8表示不同结点...原创 2019-09-07 17:21:26 · 84 阅读 · 0 评论 -
顺序表
顺序表是用一段物理地址连续的存储单元依次存储数据元素的线性结构,一般情况下采用数组存储。在数组上完成数据的增删查改。顺序表一般可以分为:静态顺序表:使用定长数组存储。动态顺序表:使用动态开辟的数组存储。接口实现:增删查改typedef int SLDataType;typedef struct SeqList{ SLDataType*_array;//存储空间基地址 也可用数...原创 2019-08-25 15:08:09 · 125 阅读 · 0 评论 -
二叉搜索树转链表(链表的值域依次增大)
二叉搜索树定义二叉查找树(Binary Search Tree),(又:二叉搜索树,二叉排序树)它或者是一棵空树,或者是具有下列性质的二叉树: 若它的左子树不空,则左子树上所有结点的值均小于它的根结点的值; 若它的右子树不空,则右子树上所有结点的值均大于它的根结点的值; 它的左、右子树也分别为二叉排序树。(源自百度百科)以上图为例:中序遍历的结果为:2 5 9 12 15 16 17 18...原创 2019-09-07 16:31:14 · 85 阅读 · 0 评论 -
链表试题
文章目录链表试题删除链表中的所有元素 x删除有序链表中所有相同的元素(不考虑内存泄漏)链表中的数据冒泡排序返回中间结点返回倒数第k个结点链表试题删除链表中的所有元素 x链表的遍历 遇到数据x删除 只需讨论特殊情况:1.空链表2.第一个结点需要删除void SListRemoveAll(SList* plist, SLTDataType x)//删除链表中所有的元素 x 面试题1{...原创 2019-08-30 23:56:14 · 160 阅读 · 0 评论 -
带头单向链表
概念链表是一种物理存储结构上非连续、非顺序的存储结构,物理存储位置是随机的。数据元素的逻辑顺序是通过链表中的指针链接次序实现的 。物理存储位置是随机的,通过指针来表示数据之间的逻辑关系。链表的结点链表中每个数据的存储都由以下两部分组成:1.数据元素本身,其所在的区域称为数据域;2.指向直接后继元素的指针,所在的区域称为指针域;每个结点都由数据域和指针域两部分组成用结构体来表示...原创 2019-08-26 22:00:58 · 108 阅读 · 0 评论 -
栈的运用之括号匹配问题
括号匹配对输入的括号进行检测,括号正确匹配如:{ ( [ ] ) { } } 显示正确括号错误匹配如:{ ( [ ) ] } 显示错误实现方法:左括号进栈(右括号不进栈),当遇到右括号时与栈顶元素 匹配 ,匹配成功,出栈 ,依次。。。。当栈为空时 说明匹配正确 否则 错误#include<stdio.h>#include<stdlib.h>#includ...原创 2019-09-02 08:52:27 · 200 阅读 · 0 评论