数据结构
一些简单的数据结构
呆码农梦中识bug,程序员哭求加工资
这个作者很懒,什么都没留下…
展开
-
反转单链表 (有头结点和无头结点两种情况)
//无头结点List Reverse( List L ){ if(!L || !(L->Next)) return L; //如果是空链表或者只有一个结点,那么就不用反转 List now = L, pre = NULL; //pre是当前结点的上一个,第一个结点的pre为NULL,这样反转后最后一个结点的Next就为NULL,刚刚好呀 while(now){ //遍历链表 List t.原创 2020-10-09 17:45:02 · 411 阅读 · 0 评论 -
数组去重 (STL + 两行代码搞定)
去重步骤如下:对数组排序 (数据存在 vector<int>a 中) 用STL封装好的函数 unique() 和 erase(); 其中unique()是把不重复的数都放到vector的前面,其他的都扔到后面去,并返回后面的第一个重复数的迭代器(如下图第箭头所指的地方),而erase()是把一个区间内的数都删掉 sort(a.begin(), a.end());a.erase(unique(a.begin(), a.end()), a.end());//经上述两个步骤后..原创 2020-10-01 16:32:47 · 1170 阅读 · 1 评论 -
基数排序 C++ (正负数均可 + 详解)
Theory: 从低位到高位, 每次分两步:把当前位相同的值放在同一个桶里面,如个位数都是1的就都放到1号桶从[0, radix - 1]把每个桶里面的值按顺序收集起来然后循环执行上述步骤k次,其中k是所有数中最大的数位Attention:如果全是非负数,那么只需要开10个桶(对于十进制数);有负数时开20个, 因为 -45 % 10 = -5,把[-9, -1]映射到[1, 9],把[0, 9]映射到[10, 19] (即加上10)Code:int a[7] = {原创 2020-12-04 12:08:19 · 1108 阅读 · 0 评论 -
6-4 The Kth Largest X in BST (30point(s)) (两种方法)
文末有福利!!!!法一:(投机取巧法)题目的意思就是在一棵BST中找到一个数X,然后得到这个数是第几大的(千万不要理解成找第X个大的数了)然后我们就可以利用BST的特点来求解:中序遍历为有序序列那么问题就转换成了在有序序列中找一个数,这时候可以暴力枚举,可以二分,想咋滴咋滴,反正就是能做了Code:int a[1000], cnt; //a数组存储中序遍历的序列void inOrder(BinTree T){ //中序.原创 2020-11-27 18:09:43 · 1767 阅读 · 0 评论 -
8-1 二叉搜索树BST的元素删除、AVL的插入算法以及Set的底层实现 (《数据结构》第九章 查找 课后作业)
BST的元素删除//注意传引用,才能作用到树本身void delete(node* &root, int x){ if(!root){ //空树,则没找到 cout << "Not Found\n"; return; } //当前结点值大于x时,根据BST的性质,则去左子树上继续找 if(root->data > x) delete(root->left, x); else if(root->d原创 2020-11-25 20:48:53 · 256 阅读 · 0 评论 -
Codeup 1919A 问题A:二叉排序树(附坑点分析)
问题 A: 二叉排序树时间限制:1 Sec内存限制:32 MB题目描述输入一系列整数,建立二叉排序数,并进行前序,中序,后序遍历。输入输入第一行包括一个整数n(1<=n<=100)。接下来的一行包括n个整数。输出可能有多组测试数据,对于每组数据,将题目所给数据建立一个二叉排序树,并对二叉排序树进行前序、中序和后序遍历。每种遍历结果输出一行。每行最后一...原创 2020-05-06 22:54:00 · 252 阅读 · 0 评论 -
【贪心+优先队列】POJ-2431 Expedition (题目 + 代码 + 详细注释)
题目太长,就直接给个链接了:Expedition题意:一辆车要到某个地方去,每走一单位距离耗一单位油,中途有若干加油站,求加油的最小次数。思路:建一个优先队列,在还没到达目的地时,执行一下操作:把当前能到达的所有加油站放入这个队列(油量大的加油站优先级高),没油时,就把队首元素取出并加油;如果队列为空,即没地方加油了,那么就到达不了目的地了!代码及注释://#i...原创 2020-05-04 15:48:18 · 320 阅读 · 0 评论 -
【优先队列】UVA - 10954 Add All (题目 + 代码 + 详细注释)
题目:(1)题目大意:给定一个集合(包含n个数),每次拿两个求和,记为Si,再把Si放入这个集合,依次类推,把n个数加完为止,要求输出的最小值(2)思路:每次选取最小的两个值相加,这样求得的结果最小(3)实现方法:1、每次把Si放入集合后,就排序一次(次数太多,会超时) 2、用优先队列(4)代码:#include<bits/stdc++.h>using...原创 2020-05-04 13:17:11 · 272 阅读 · 0 评论 -
洛谷P1540 机器翻译 (C语言 + 详细注释)
题目背景小晨的电脑上安装了一个机器翻译软件,他经常用这个软件来翻译英语文章。题目描述这个翻译软件的原理很简单,它只是从头到尾,依次将每个英文单词用对应的中文含义来替换。对于每个英文单词,软件会先在内存中查找这个单词的中文含义,如果内存中有,软件就会用它进行翻译;如果内存中没有,软件就会在外存中的词典内查找,查出单词的中文含义然后翻译,并将这个单词和译义放入内存,以备后续的查找和翻译。...原创 2020-01-31 14:51:50 · 1042 阅读 · 0 评论 -
【队列】解密QQ号 ---啊哈算法(C语言 + 详细注释)
//这道题是典型的队列题,设个head,tail,表示队列的头和尾,二者之间表示有效的数,下面是我AC的代码:#include<stdio.h>int f[200005];int main() { int n, i; scanf("%d", &n); for (i = 0; i < n; i++) scanf("%d", &f[i])...原创 2020-01-29 14:48:59 · 1085 阅读 · 0 评论