数据结构
数据结构知识介绍和模板代码
echo_xiao9
这个作者很懒,什么都没留下…
展开
-
HASH排序方法统计整数出现的次数
【问题描述】用HASH方法统计整数出现的次数【输入形式】以逗号分隔,#结尾的整数【输出形式】等式。左侧为排序好的整数,右侧为其出现的次数。【样例输入】2, 6, 7, 13, 18, 3, 6, 1, 3, 7#【样例输出】1=12=13=26=27=213=118=1哈希排序#include <iostream>using namespace std;int main() { string s;int a[100000]={0}; cin&原创 2020-06-23 19:48:26 · 1100 阅读 · 2 评论 -
堆排序——第K大数字
Description找出长度为N的数组A中的第K大数字。(N>=K)Input Format第一行为两个整数N和K。第二行为数组A。Output Format一个数字。Sample Input5 27 1 5 9 8Sample Output8Tips复杂度应控制在 O(N log K) 或者 O(N + K log N)分析:堆排序的时间复杂度O(NlogN),不变,创建一个大小为k的堆#include <iostream>using namespace原创 2020-06-23 16:55:01 · 793 阅读 · 0 评论 -
判断平衡的二叉树
【问题描述】给出一个二叉树,判断其是否是一个高度平衡的二叉树。其中 数值为-1 代表该节点为NIL【输入形式】第一行:输入节点的数量第二行:各个节点的数值【输出形式】若为高度平衡的二叉树,输出1,否则输出0【样例输入】73 9 20 -1 -1 15 7【样例输出】1【样例输入】91 2 2 3 3 -1 -1 4 4【样例输出】0【样例说明】在上述样例输入中 1 2 2 3 3 -1 -1 4 4所示树的形状为 1 /原创 2020-06-09 00:11:10 · 283 阅读 · 0 评论 -
判断二叉查找树后序遍历结果
问题描述】输入一个整数数组,判断该数组是不是某二叉查找树的后序遍历的结果。如果是则输出1,否则输出0。假设输入的数组的任意两个数字都互不相同。【输入形式】第一行:整数数组数量。第二行:n个正整数a1,…,an 每个数用空格隔开。【输出形式】数组是二叉查找树的后序遍历则输出1,否则输出0。【样例输入】75 7 6 9 11 10 8【样例输出】1【样例输入】11122 99 70 110 105 100 103 120 250 200 300【样例输出】0存在性相当于给出了原创 2020-06-09 00:07:39 · 371 阅读 · 0 评论 -
二叉查找树的建立与查找
【问题描述】在一棵初始为空的二叉查找树上依次插入n个互不相同的正整数: a1,…,an;现要求在该二叉查找树上查找一个给定的数x,并给出查找过程中需要比对的数的路径。【输入形式】第一行:正整数的数目n;第二行:n个正整数a1,…,an,每个数用空格隔开;第三行:待查找的数x。【输出形式】第一行:1(查询成功)或-1(查询失败);第二行:查找过程中需要比对的路径,每个数用空格隔开。【样例输入】11122 99 70 110 105 100 103 120 250 200 300100【原创 2020-06-08 23:52:26 · 596 阅读 · 0 评论 -
最小化堆实现优先队列
【问题描述】使用最小化堆实现一个整型的优先队列,实现下列功能:insert x,将优先级值为x的元素入队find x,找出优先级值大于x的最小的元素,输出其下标。如果有多个元素优先级值相同输出下标最小的那个。decrease i v,将第i个节点的优先级值减少v。【输入形式】第一行含有一个正整数M(1<=M<=20000),代表总的操作数。以下M行,每行一个操作。【输出形式】对于每个find操作,输出一个下标。回车分隔。【样例输入】9insert 5insert 6i原创 2020-06-06 15:13:51 · 989 阅读 · 0 评论 -
二叉树节点间的最大距离问题
【问题描述】从二叉树的节点 A 出发,可以向上或者向下走,但沿途的节点只能经过一次,当到达节点 B 时,路径上的节点数叫作 A 到 B 的距离。现在给出一棵二叉树,求整棵树上每对节点之间的最大距离。【输入形式】第一行输入两个整数 n 和 root,n 表示二叉树的总节点个数,root 表示二叉树的根节点。以下 n 行每行三个整数 fa,lch,rch,表示 fa 的左儿子为 lch,右...原创 2020-04-27 21:58:07 · 533 阅读 · 0 评论 -
二叉树最长路径问题
【问题描述】对给定的一个二叉树,请编写程序,完成功能:输出从根结点到叶节点的最长路径长度,并输出第一条最长路径【输入形式】前序遍历二叉树【输出形式】两行,第一行为整型,长度;第二行为最长路径的各个节点。【样例输入】ABD##EHJ##KL##M#N###CF##G#I##【样例输出】7ABEHKMN【样例说明】如果有多条最长路径只输出第一条就可以,输入前序遍历,其中#代表...原创 2020-04-24 09:39:00 · 2180 阅读 · 0 评论 -
已知中序和后序,求二叉树的前序遍历
【问题描述】给定二叉树节点个数以及其中序遍历和后序遍历,求其前序遍历。【输入形式】共三行。第一行是一个正整数N,表示节点个数。第二行共N个正整数,表示二叉树的中序遍历。第三行共N个正整数,表示二叉树的后序遍历。【输出形式】共一行,输出前序遍历。【样例输入】103 6 7 4 5 9 10 2 8 13 7 6 5 10 9 4 8 1 2【样例输出】2 4 6 3 7 ...原创 2020-04-23 21:58:12 · 1788 阅读 · 0 评论 -
最大连续子序列
最大连续子序列和问题是个很老的面试题了,最佳的解法是O(N)复杂度,当然其中的一些小的地方还是有些值得注意的地方的。这里还是总结三种常见的解法,重点关注最后一种O(N)的解法即可。需要注意的是有些题目中的最大连续子序列和如果为负,则返回0;而本题目中的最大连续子序列和并不返回0,如果是全为负数,则返回最大的负数即可。问题描述求取数组中最大连续子序列和,例如给定数组为A={1, 3, -2,...转载 2020-04-20 22:17:46 · 369 阅读 · 0 评论 -
判断一个数列是否是栈的有效输出序列
【问题描述】给出一个堆栈的输入序列,试判断一个序列是否能够由这个堆栈输出。如果能,则为有效输出,返回总的出栈次数,如果不能,则为无效输出,返回0。序列的输入及输出都是从左往右。1、输入输出序列皆为正整数,可能有重复的数字2、如果一个数字在输入序列中没有出现,但在输出序列中出现,则为无效输出。3、如果一个数字在输入序列中出现,但在输出序列中没有出现,只要输出可以通过对输入数字进行出栈操作获取,...原创 2020-03-28 21:09:57 · 3963 阅读 · 2 评论 -
左边第一个小的数
【问题描述】给定一个数组,输出每个对每个位置而言左边第一个比其小的数的位置,如果不存在则输出-1。【输入形式】第一行一个数n<=10^5,表示数组大小。第二行n个数,描述数组。【输出形式】一行n个数【样例输入】1010 2 4 5 3 1 2 8 9 6【样例输出】-1 -1 2 3 2 -1 6 7 8 7解决代码#include <iostream>...原创 2020-03-28 10:18:48 · 714 阅读 · 0 评论 -
LeetCode字符串-6 字符串的Z型变换
【问题描述】将一个给定字符串根据给定的行数,以从上往下、从左到右进行 Z 字形排列。例如输入字符串为 “SHUJUJIEGOU” 行数为 3 时,排列如下:S U GHJJEOU I U之后,你的输出需要从左往右逐行读取,产生出一个新的字符串,例如:“SUGHJJEOUIU”。请你实现这个将字符串进行指定行数变换的函数:【输入形式】string 字符串 和 1个 int 类型的正...原创 2020-03-22 21:13:43 · 229 阅读 · 0 评论 -
约瑟夫环实现(循环链表和数学公式法)
约瑟夫环实现报数个数超出总人数题目:【问题描述】约瑟夫问题(有时也称为约瑟夫斯置换),是一个出现在计算机科学和数学中的问题。在计算机编程的算法中,类似问题又称为约瑟夫环。人们站在一个等待被处决的圈子里。 计数从圆圈中的指定点开始,并沿指定方向围绕圆圈进行。 在跳过指定数量的人之后,执行下一个人。 对剩下的人重复该过程,从下一个人开始,朝同一方向跳过相同数量的人,直到只剩下一个人,并被释放...原创 2020-03-22 19:42:33 · 388 阅读 · 0 评论 -
欧拉筛
原理:比起埃氏算法,减少了重复筛选。让每个数只能被最小的质数最大的合数筛选。在埃氏算法中,30被215,310,56都筛选了,这里只被2*15筛选。关键if (i % prime[j] == 0) {break;}如果 I=k* prime[j],不break,下一步筛掉k* prime[j]* prime[j+1],而k* prime[j]* prime[j+1]会在 I=k*prim...原创 2020-03-06 19:29:46 · 193 阅读 · 0 评论 -
AVL树实现:
#include <iostream>using namespace std;template <class KEY,class OTHER>struct SET{ KEY key; OTHER other;};template <class KEY,class OTHER>class dynamicSearchTable{public://纯虚函数 virtual SET<KEY,OTHER>*find(const K原创 2020-05-15 08:56:32 · 265 阅读 · 0 评论 -
二叉查找树(动态查找)
动态查找之二叉查找树定义,实现(插入,删除,情况,创建,析构)特别注意删除的做法,重点!插入的时候有一个问题,new指针会不会丢失?#include <iostream>using namespace std;template <class KEY,class OTHER>struct SET{ KEY key; OTHER oth...原创 2020-04-29 23:05:23 · 426 阅读 · 1 评论 -
静态查找表:无序,有序,顺序查找,二分查找,STL
《数据结构 思想与实现第二版》第八章代码摘录集合元素的类型template <class KEY,class OTHER>struct SET{ KEY key; OTHER other;};以下的数组都是从1开始存储,0号当成哨兵或者不用无序表的顺序查找template<class KEY,class OTHER>int seqSearc...原创 2020-04-29 20:30:46 · 754 阅读 · 0 评论 -
递归函数的包裹函数
对于递归函数,必须有一个控制递归的参数,在参数满足某个特定条件的情况下,递归停止。对于私有的递归函数。对于用户来说,他不需要知道这个参数,只要传入初始值就可以,对应于公有的包裹函数举例:在求二叉树的高度的时候,用户只要传入二叉树的根节点。然而,在递归的时候,参数是每个子树的根节点,当根节点为空,递归结束。public: int height()const{ return ...原创 2020-04-21 20:45:13 · 202 阅读 · 0 评论 -
二叉树的非递归遍历
递归时间、空间效率低、这里使用栈改为非递归。前序遍历:1.根节点入栈,2.栈顶元素出栈,访问3.该元素的右儿子入栈4.该元素的左二子入栈重复234直到栈空中序遍历区分两种情况(图)1.用原有的Node类构造一个带有入栈次数的StNode2.根节点入栈3.栈顶元素出栈,如果是第一次,自己入栈,左儿子入栈;如果是第二次,访问,右儿子入栈。4.重复3直到栈空中序遍历和中序类似...原创 2020-04-18 22:08:58 · 132 阅读 · 0 评论 -
二叉树最长路径递归实现
对给定的二叉树,编写一个程序,输出从叶子结点到根结点的最左边的一条最长路径。//递归函数 vector<Node*> find_max_depth(Node *t){ vector<Node*>lv;vector<Node*>rv;vector<Node*>v; if(t==NULL)retur...原创 2020-04-18 19:06:53 · 691 阅读 · 0 评论 -
二叉树的队列实现
二叉树的C++队列实现原创 2020-04-15 22:48:58 · 1545 阅读 · 0 评论 -
树和二叉树的定义及区别
无向树在离散数学中的定义:连通无回路的无向图满足以下三个条件之二即可判定1.连通2.无回路3.树枝数=节点数-1有向树:恰有一个结点入度为0,其他结点入度为1有序树:子女有排序,老大老二老三二叉树:每个结点最多有两个子树的树结构。通常子树被称作“左子树”(left subtree)和“右子树”(right subtree)。(1)空二叉树——如图(a);(2...原创 2020-04-13 20:20:17 · 3826 阅读 · 1 评论 -
表达式求值
#include <iostream>#include <stack>#include <cmath>using namespace std;class calc{ char* expression; enum token{OPAREN ,ADD ,SUB ,MULTI, DIV, EXP, CPAREN, VALUE, EOL};//已...原创 2020-04-13 20:11:54 · 195 阅读 · 0 评论 -
k长子序列的最小值
【问题描述】给定一个序列,输出其中各连续k长子序列的最小值。【输入形式】第一行2个数,n, k <= 10^5第二行n个数【输出形式】一行n - k + 1个数,表示各连续k长子序列的最小值。【样例输入】10 310 2 4 5 3 1 2 8 9 6【样例输出】2 2 3 1 1 1 2 6【样例说明】【评分标准】10个点,各10分。思路:1.构造一个k个元...原创 2020-04-08 20:27:40 · 497 阅读 · 0 评论 -
二维队列,队列数组
即为一组队列,队列的头放在数组里面,对每个队列的操作,使用que[i].push(1);#include<cstdio>#include<queue>#include<iostream>using namespace std;int main(){ int N,M,K,Q; cin >> N >> M >> K ...原创 2020-04-06 14:19:16 · 4465 阅读 · 0 评论 -
vector 使用
转载一篇好文,讲的很清楚https://www.cnblogs.com/BeyondAnyTime/archive/2012/08/08/2627666.html转载 2020-03-23 11:54:11 · 78 阅读 · 0 评论