
数据结构
文章平均质量分 54
Respect@
感谢
展开
-
求二叉树高度
int height(BiTree T) { int l,r,h =0; if(T){ l=height(T->left); r=height(T->right); if(l>r){ h=l+1; }else { h=r+1; } } return h;}原创 2021-05-27 18:29:23 · 137 阅读 · 0 评论 -
二叉树:计算度为0的结点
/* 计算度为0的结点*/ void CountNode1(BiTree T){ if(T == NULL) //跳出递归条件 return; if(T->left == NULL&&T->right == NULL)//关系运算优先级== 大于逻辑运算&& count0++; CountNode1(T->right);//可以与下式调换位置 CountNode1(T->left); } ...原创 2021-05-27 18:25:26 · 3244 阅读 · 1 评论 -
哈夫曼二叉树构建
哈夫曼编码举例:假设要对“we will we will r u”进行压缩。压缩前,使用 ASCII 码保存:下面我们先来统计这句话中每个字符出现的频率。如下表,按频率高低已排序:接下来,我们按照字符出现的频率,制定如下的编码表:哈夫曼二叉树构建:按出现频率高低将其放入一个数组中,从左到右依次为频率逐渐增加2. 从左到右进行合并,依次构建二叉树。第一步取前两个字符 u 和 r 来构造初始二叉树,第一个 字符作为左节点,第二个元素作为右节点,然后两个元素相加作为新的空元素,并且两者原创 2021-05-17 16:47:13 · 1603 阅读 · 6 评论 -
查找算法:数组和索引,二分查找,穷举搜索,并行搜索
这里写目录标题查找的定义数组和索引二分查找穷举搜索查找的定义查找:又称检索或查询,是指在查找表中找出满足一定条件的结点或记录对应的操作。查找表:在计算机中,是指被查找的数据对象是由同一类型的记录构成的集合,如顺序表, 链表、二叉树和哈希表等查找效率: 查找算法中的基本运算是通过记录的关键字与给定值进行比较,所以查找的效率 同常取决于比较所花的时间,而时间取决于比较的次数。通常以关键字与给定值进行比较的记录个数的平均值来计算。查找操作及分类操作查找某个“特定的”数据元素是否存在在查找表中原创 2021-04-29 17:10:37 · 1108 阅读 · 3 评论 -
排序算法:选择排序,冒泡排序,插入排序,希尔排序,归并排序,快速排序
这里写目录标题选择排序冒泡排序插入排序希尔排序归并排序快速排序选择排序常规思维:第一步 先找出最大数,与最后一个数交换。第二步 再找出除最后一个最大数,与倒数第二个交换位置。。。。 。。。重复以上步骤冒泡排序以上过程就是冒泡排序:通过重复地遍历未排序的数列,一次比较两个元素,如果它们的顺序错误就把它们交换过来。走访数列的工作是重复地进行直到没有再需要交换,也就是说该数列已经排序完成。这个算法的名字由来是因为越小的元素会经由交换慢慢得像泡泡一样“浮”到数列的顶端,故而得名!原创 2021-04-27 16:08:31 · 831 阅读 · 4 评论 -
五大常规算法:分治法,动态规划算法,回朔法,贪心算法,分支定界法
这里写目录标题五大常规算法动态规划算法回溯算法贪心算法分支定界法五大常规算法两部分组成:分(divide):递归解决较小的问题治(conquer):然后从子问题的解构建原问题的解三个步骤分解(Divide):将原问题分解为若干个规模较小,相互独立,与原问题形式相同的子问题;解决(Conquer):若子问题规模较小而容易被解决则直接解决,否则递归地解各个子问题;合并(Combine):将各个子问题的解合并为原问题的解.将 16 枚硬币分为左右两个部分,各为 8 个硬币,分别称重,必然会有原创 2021-04-25 18:28:55 · 2712 阅读 · 3 评论 -
栈的综合应用:数的转换,括号匹配的检验,行编辑,迷宫求解,表达式求值
栈的综合应用:数的转换,括号匹配的检验,行编辑,迷宫求解,表达式求值源码:Stack.h:#pragma once#include <stdio.h>#include <stdlib.h>#define MAXSIZE 100typedef struct _Position {//迷宫坐标 int _x; int _y;}Position;#define MaxSize 128 //预先分配空间,这个数值根据实际需要预估确定typedef Positi原创 2021-04-24 12:51:57 · 1675 阅读 · 4 评论 -
图:邻接表的深度遍历,广度遍历,最短路径,A*算法
这里写目录标题图图的表示结论:图的导航-最短路径算法A*算法图在计算机科学中,一个图就是一些顶点的集合,这些顶点通过一系列边结对(连接)。顶点用圆圈表示,边就 是这些圆圈之间的连线。顶点之间通过边连接。注意:顶点有时也称为节点或者交点,边有时也称为链接。社交网络,每一个人就是一个顶点,互相认识的人之间通过边联系在一起, 边表示彼此的关系。这种关系可以 是单向的,也可以是双向的!地图导航 - 起点、终点和分叉口(包括十字路口·、T 字路口等)都是顶点,导航经过的两顶点的路径就是边!我们导航从一原创 2021-04-21 19:49:10 · 1943 阅读 · 5 评论 -
哈希表及其企业级应用
这里写目录标题哈希表的原理精讲哈希表结构体定义企业级应用文件接口储存基本单位文件存储单位文件结构哈希表的原理精讲哈希表 - 散列表,它是基于快速存取的角度设计的,也是一种典型的“空间换时间”的做法键(key)组员的编号值(value)组员的其它信息索引数组的下标(0,1,2,3,4) ,用以快速定位和检索数据哈希桶保存索引的数组(链表或数组),数组成员为每一个索引值相同的多个元素哈希函数将组员编号映射到索引上,采用求余法原理示意图:哈希表结构体定原创 2021-04-18 16:31:03 · 535 阅读 · 2 评论 -
树:二叉树,完全二叉树,满二叉树,平衡二叉树,二叉搜索树,红黑树,的原理及其应用
这里写目录标题树二叉树的原理精讲二叉搜索树插入节点二叉搜索树删除节点二叉树的遍历树树状图是一种数据结构,它是由 n(n>=1)个有限结点组成一个具有层次关系的集合。把它叫做“树”是因 为它看起来像一棵倒挂的树,也就是说它是根朝上,而叶朝下的。每个结点有零个或多个子结点;没有父结点的结点称为根结点;每一个非根结点有且只有一个父结点;除 了根结点外,每个子结点可以分为多个不相交的子树;二叉树的原理精讲二叉树是一个每个结点最多只能有两个分支的树,左边的分支称之为左子树,右边的分支称之为右子原创 2021-04-17 11:27:38 · 6959 阅读 · 26 评论 -
顺序结构栈的使用----表达式求值
这里写目录标题表达式求值的含义:输入格式:表达式求值的含义:给定一个只包含加减乘除法运算的算术表达式,请你编程计算表达式的值。输入格式:输入一行,为需要你计算的表达式,表达式中只包含数字、加法运算符“+”、 减法运算符 “-”、乘法运算符“*”和 除 法运算符“/”,且没有括号,不考虑数值的范围(溢出),待求解的表达式以“=”号结束比较 lhs 的优先级是否不高于 rhs,rhs 表示栈顶的符号bool isLarger(const int& lhs, const int&原创 2021-04-15 08:42:48 · 760 阅读 · 2 评论 -
队列:线程池中的任务队列,循环队列,优先队列,高并发 WEB 服务器队列的应用(更新迭代)
顺序存储 采用数组来保存队列的元素,设立一个队首指针 front ,一个队尾指针 rear,分别指向队首和队尾元素。则 rear-front 即为存储的元素个数!原创 2021-04-13 19:28:06 · 812 阅读 · 0 评论 -
迷宫求解----更新迭代
迷宫求解问题:1.为什么要使用栈2.什么是回溯法栈的原理:栈也是一种线性表,只不过它是操作受限的线性 表,只能在一端操作。 进出的一端称为栈顶(top),另一端称为栈底(base)。栈可以用顺序存储,也可以用链式存储。找迷宫通路需要使用回溯法,找迷宫通路是对回溯法的一个很好的应用,实现回溯的过程用到数据结构回溯法:对一个包括有很多个结点,每个结点有若干个搜索分支的问题,把原问题分解为若干个子问题求解的 算法。当搜索到某个结点发现无法再继续搜索下去时,就让搜索过程回溯(回退)到该节点的前一个原创 2021-04-06 21:04:14 · 637 阅读 · 4 评论 -
顺序栈的原理和使用
栈的原理栈只能在一端操作,后进先出,这是栈的关键特征,也就是说不允许在中间查找、取值、插入、删除等进出的一端称为栈顶(top),另一端称为栈底(base)。栈可以用顺序存储,也可以用链式存储。base 指向栈底,top 指向栈顶。栈数据结构的定义//结构体的定义typedef struct _SaStack { ElemType* base; //栈底指针 ElemType* top; //栈顶指针}SqStack;//栈的初始化bool InitStack(SqStack原创 2021-04-10 15:02:39 · 1241 阅读 · 2 评论 -
C++中的双向链表
单链表中每个结点除了存储自身数据之后,还存储了下一个结点的地址,因此可以轻松访问 下一个结点,以及后面的后继结点,但是如果想访问前面的结点就不行了,再也回不去了。 例如删除结点 p 时,要先找到它的前一个结点 q,然后才能删掉 p 结点,单向链表只能往 后走,不能向前走。如果需要向前走,怎么办呢? 可以在单链表的基础上给每个元素附加两个指针域,一个存储前一个元素的地址,一个存储 下一个元素的地址。这种链表称为双向链表...原创 2021-04-01 08:16:31 · 209 阅读 · 1 评论 -
数据结构:删除顺序表中小于min和大于max的数(不需要从大到小排列依然可以)
1.题目要求:设计一个算法,删除递增有序链表中值小于min和大于max的所有元素2.题目分析依次找到对应元素,而后进行删除.int listDelete(SqList& L, int min, int max) //删除顺序表中小于min,大于max的元素{ int n =L.length; while (n) { for (int i = 1; i <= L.length; i++) { if (L.elems[i-1]<min || L.elems[i-原创 2021-03-28 15:37:19 · 3046 阅读 · 0 评论 -
排序算法(选择排序 冒泡排序 插入排序 希尔排序 )的运用 C++版本
#include <stdio.h>#include <stdlib.h>void swap(int* num1, int* num2) { int temp = *num1; *num1 = *num2; *num2 = temp;}void SelectSort1(int arr[], int len) {//选择排序 for (int i = 0; i < len - 1; i++) { int max = 0; for (int j = .原创 2021-03-24 20:42:10 · 184 阅读 · 0 评论 -
链表的使用(迭代更新版本)
#include <iostream>using namespace std;//单链表的初始化typedef struct _LinkNode { int data;//结点的数据域 struct _LinkNode* next;//结点的指针域}LinkNode,LinkList;//链表节点、链表bool InitList(LinkList*& L) { L = new LinkNode; if (!L)return false;//生成结点失败 L-原创 2021-03-23 08:22:58 · 520 阅读 · 0 评论 -
顺序表的初始化,增加,删除,摧毁
#include<stdlib.h>#include <iostream>using namespace std;#define MAX_SIZE 100typedef struct { int* elems;//顺序表地址 int length;//顺序表长度 int size;//顺序表的空间}SqList;bool InitList(SqList& L);//顺序表的初始化bool listAppend(SqList& L, int e原创 2021-03-23 08:03:03 · 362 阅读 · 0 评论 -
循环链表的算法实现
循环链表循环链表的示意图:1.循环链表结构体的定义typedef struct _LinkNode{ int data; //结点的数据域 struct _LinkNode *next;//结点的指针域}LinkNode,LinkList;//LinkList为指针结构体LNode的指针类型2.循环链表的初始化bool InitList(LinkList *&L)//构建一个空的链表L{ L=new LinkNode;//生成新节点作为头结点 if(!L)return f原创 2021-04-11 17:44:22 · 430 阅读 · 0 评论