提高篇——数据结构专题
链表、栈、树、图等基本数据结构的代码、习题
晴空_万里
条条框框框住的是行为,而不是大脑。
展开
-
优先队列实现哈夫曼树
使用优先队列来实现比较方便~优先队列:和队列基本操作相同:top 访问队头元素empty 队列是否为空size 返回队列内元素个数push 插入元素到队尾 (并排序)emplace 原地构造一个元素并插入队列pop 弹出队头元素swap 交换内容区别:queue使用q.front()访问队首,优先队列使用q.top()访问队首定义:priority_queue<Ty...原创 2020-02-05 11:35:13 · 493 阅读 · 0 评论 -
大顶堆建堆、堆排序(完整代码)
这个建堆调整过程还是蛮艰辛的。。#include <stdio.h>#include <algorithm>using namespace std;const int maxn = 100;//heap为堆,n为元素个数 int heap[11] = {0,5,22,3,45,6,7,88,9,71,16}; //第一个节点存储于数组的1号位,改变这几个字...原创 2020-02-04 17:55:30 · 1299 阅读 · 0 评论 -
(算法练习)——好朋友(并查集的使用)
注意点:1、初始化,father[i] = i; 使每个节点先各自独立,输入为一组的话再合并(同时也符合根不同才能合并)2、isRoot[i] = false;这是用来记录根节点的个数《算法笔记》P332#include <stdio.h>const int maxn = 110;int father[maxn];bool isRoot[maxn];int findf...原创 2020-02-03 19:07:06 · 561 阅读 · 0 评论 -
并查集相关
查找父亲节点(并压缩路径)//查找父亲节点,把当前查询节点的路径上的所有节点的父亲都指向根节点// (降低查找父亲节点的时间复杂度) int findFather(int x){ //由于x在下面的while中会变成根节点,因此先把原先的x保存一下 int a = x; while(x != father[x]){ x = father[x]; } //到这里,x存放的是根节...原创 2020-02-03 15:48:49 · 82 阅读 · 0 评论 -
AVL树(平衡二叉树)的建立、插入及调整(完整代码)
把算法笔记的代码补齐了《算法笔记》P327主要是LL、LR、RR、RL几种旋转调整、height的获得、平衡因子的获得代码:#include <stdio.h>#include <algorithm>using namespace std;struct node{ int v,height; node *lchild; node *rchild;};...原创 2020-02-03 13:12:28 · 1656 阅读 · 2 评论 -
(算法练习)——PAT A1043 Is it a Binary Search Tree
《算法笔记》P315这一题主要是vector的&的用法(第一次见)判断两个vector是否相等镜像树的先序、后序遍历#include <stdio.h>#include <vector>using namespace std;vector<int> origin,pre,preM,post,postM;//保存初始数据、前序、镜像前序、后...原创 2020-02-03 10:39:37 · 226 阅读 · 0 评论 -
二叉排序树的创建、查找、节点删除、中序遍历(完整代码)
要注意的是删除节点的那一部分代码(用前驱或后继替代),结合理论知识来记忆代码:#include <stdio.h>#include <queue>using namespace std;struct node{ int data; node* lchild; node* rchild;};node* root = NULL;//新建一个节点node...原创 2020-02-02 20:28:51 · 578 阅读 · 0 评论 -
(算法练习)——PAT A1053 Path of Equal Weight(树的DFS使用)
《算法笔记》P305这一题要搞清楚节点的编号、节点的数据有几点要说明:1、child是编号,递归的也是编号,path中存放的也是编号2、关键在于存放节点数据的时候,00对应的就是第一个节点,04对应的就是第3个节点,所以path[i]取到的编号如04,实际就是Node[4].weight也就是说弄上编号00,实际就是0位置,05,实际就是5位置,数组取数的时候前导0忽略不计验证代码:...原创 2020-02-02 16:02:49 · 218 阅读 · 0 评论 -
树的静态写法与先序、层序遍历
这里还是有问题的,使用vector的话确实应该用push_back(),主要在每个节点的孩子节点关系建立上,参考代码2代码1:#include <stdio.h>#include <queue>#include <vector>using namespace std;const int maxn = 100;struct node{ int d...原创 2020-02-01 21:51:14 · 136 阅读 · 0 评论 -
二叉树的静态实现(完整代码)
静态实现就是使用数组,要弄清楚这里的root就是个数字#include <stdio.h>#include <queue>using namespace std;const int maxn = 100;struct node{ int data; int lchild; int rchild;}Node[maxn];int index = 0;i...原创 2020-02-01 18:39:57 · 718 阅读 · 3 评论 -
(算法练习)——【先序、中序遍历确定二叉树】PAT A1020 Tree Traversals
主体部分代码:需要知道先序、中序序列的区间//当前先序序列区间为[preL,preR],中序序列区间为[inL,inR],返回根节点地址 node* create(int preL,int preR,int inL,int inR){ if(preL>preR){ return NULL;//先序序列长度小于等于0,直接返回 } node* root = new node;...原创 2020-02-01 17:07:13 · 167 阅读 · 2 评论 -
(算法练习)——二叉树创建、遍历的实现(完整代码)
完整实现代码,最重要的是创建节点时插入左右子树的顺序,这关乎这颗二叉树长什么样!!#include <stdio.h>#include <queue>using namespace std;int data[10];struct node{ int data; node* lchild; node* rchild;};//初始根节点为空 node* ...原创 2020-02-01 15:22:17 · 2831 阅读 · 0 评论 -
(算法练习)——二叉树的各种遍历
先序、中序、后序都是用递归实现的,没啥好说的代码://先序遍历void preorder(node* root){ if(root == NULL){ return; } printf("%d\n",root->data);//访问根节点root,如输出数据等 //访问左子树 preorder(root->lchild); //访问右子树 preorder(r...原创 2020-01-31 15:55:44 · 105 阅读 · 0 评论 -
(算法练习)——二叉树存储结构与基本操作
存储结构与基本的操作//二叉树的创建struct node{ int data; node* lchild;//指向左子树根节点的指针 node* rchild;//指向右子树根节点的指针 }; //二叉树建树前根节点不存在,其地址一般设为NULL node* root = NULL;//生成一个新节点,v为节点权值 node* newNode(int v){ node* ...原创 2020-01-31 15:12:12 · 199 阅读 · 0 评论 -
关于queue的数据修改
简单说,修改队列中的元素不改变原元素;修改原元素也不改变队列中的元素代码:#include <stdio.h>#include <queue>using namespace std;struct node{ int data;}a[10];int main(){ queue<node> q; for(int i = 1;i <= 3...原创 2020-01-31 12:14:56 · 3219 阅读 · 0 评论 -
(算法练习)——BFS(广度优先搜索)【出迷宫】
《算法笔记》P280这一题值得珍藏!!#include <stdio.h>#include <string.h>#include <queue>using namespace std;const int maxn = 100;struct node{ int x,y;//位置{x,y} int step;//step为从起点S到大该位置的最少...原创 2020-01-30 18:57:56 · 214 阅读 · 0 评论 -
(算法练习)——BFS(广度优先搜索)
《算法笔记》P276感觉这一题最有意思的是判断元素的上下左右四个位置代码:#include <stdio.h>#include <queue>using namespace std;const int maxn = 100;struct node{ int x,y;}Node;int n,m;//矩阵的大小为n*m int matrix[maxn]...原创 2020-01-30 18:11:59 · 336 阅读 · 0 评论 -
(算法练习)——DFS(深度优先搜索)
用递归来实现深度优先搜索《算法笔记》P271背包问题#include <stdio.h>const int maxn = 30;int n,V,maxValue = 0;int w[maxn],c[maxn];/*void DFS(int index,int sumW,int sumC){ if(index == n){//死胡同 if(sumW <= V...原创 2020-01-30 13:55:57 · 209 阅读 · 0 评论 -
(算法练习)——PAT A1052 Linked List Sorting
《算法笔记》P265存疑:1、排序规则那里,无效节点放到后面去,什么意思?#include <stdio.h>#include <algorithm>using namespace std;const int maxn = 100005;struct NODE{ int address,data,next; bool flag;}node[maxn];...原创 2020-01-30 11:51:55 · 113 阅读 · 0 评论 -
(算法练习)——PAT A1032 Sharing
这一题要说一下,输入格式里面直到-1才是一条链表的结束思路是使用静态链表保存两个链表的数据,并且查询有无共用节点《算法笔记》P263#include <cstdio>#include <string.h>const int maxn = 100010;struct NODE{ char data;//数据域 int next;//指针域 bool fl...原创 2020-01-29 15:40:58 · 196 阅读 · 0 评论 -
链表处理
0、为链表节点(动态)分配内存空间、释放C++下面的new使用方便,比较推荐//malloc的申请方式 typename* p = (typename*)malloc(sizeof(typename));int *p = (int*)malloc(sizeof(int));node *p = (node*)malloc(sizeof(node));//new的申请方式(c++中的)t...原创 2020-01-29 12:39:55 · 179 阅读 · 0 评论 -
队列的常见操作
示例代码,感觉这一部分应该结合数据结构的代码来多看看,可惜一时半会回不去。。队列先进先出//清空clear() void clear(){ front = rear = -1;}//获取队列内元素的个数size() int size(){ return rear - front;}//判空empty()bool empty(){ if(front == rear) retu...原创 2020-01-29 10:45:34 · 169 阅读 · 0 评论 -
(算法练习)——简单计算器
要求:http://codeup.cn/problem.php?cid=100000605&pid=0说明:栈、队列的使用;中缀表达式转后缀表达式《算法笔记》P250代码:#include <iostream>#include <stdio.h>#include <string>#include <stack>#inclu...原创 2020-01-28 13:16:13 · 561 阅读 · 0 评论