Date Structuress
KayeJohn
爱代码 爱学习 爱生活
展开
-
数据结构学习笔记(1)---单向链表
数据结构学习笔记—单向链表链表的初始化头插法创建链表尾插发创建链表链表的显示按索引值查找节点按索引值删除节点按索引值添加节点(1)链表的初始化void InitList(pListNode *pHead){ *pHead = new ListNode; (*pHead)->next = NULL;}(2)头插法创建链表void HeadCreatList(pL原创 2017-09-13 13:09:57 · 297 阅读 · 0 评论 -
数据结构学习笔记(21)----红黑树
(一)什么是红黑树对于红黑来说,其是从AVL树演变而来,因此首先应该满足AVL(平衡二叉树)的性质。然后在满足以下性质: (1)节点非红即黑 (2)根节点必须是黑 (3)叶子结点为空且必须为黑 (4)任意一个节点到叶节点的路径中黑节点子树相同 例如: 满足上述性质就是一棵红黑树了,但是对于红黑树的删除与插入必须也要满足以上的条件,下面就来说一下红黑树的插入与删除(二)红黑树原创 2017-11-06 23:29:48 · 646 阅读 · 2 评论 -
数据结构学习笔记(13)---哈希查找
(1)哈希查找的思想:首先根据一个人关键字映射该关键字的地址,即若关键字为k,确立一个人函数p = H(k),此时p就是该关键字的存储地址,当查找一个人关键字的时候就可以根据函数计算出相应的地址。(2)哈希函数构造原则:一是函数本身便于计算,二是计算出来的函数遍布均匀,尽可能减少冲突。哈希函数常有五种:a**.数字分析法**:事先知道该关键字集合,并且每个关键字的位数比哈希表地址位数多,则可以从关键原创 2017-10-22 13:12:03 · 701 阅读 · 0 评论 -
数据结构学习笔记(14)---插入排序
数据结构学习笔记(14)—内部排序基本思想:在一个已经排好序的记录子集的基础上,每一步将下一个人等待排序的记录有序插入到已经排序的记录子集上,知道所有待排序记录全部插入为止。(1)直接插入排序:直接插入排序其实很简单,从第二个元素开始,逐步插入到已排序子序列中。其比较实用与排序记录数比较少的情况,排序数目较大时,该算法排序性能不太好。代码如下:void InsertSort(int a[], int原创 2017-10-22 14:42:13 · 264 阅读 · 0 评论 -
数据结构学习笔记(12)----平衡二叉排序树
定义:左子树与右子树的高度之差的绝对值小于等于1 左右子树也是平衡二叉树 a.平衡因子定义: 节点的左子树与右子树的深度之差** 例如: 平衡树的平衡方法:(1)LL型 B = A->lchild; A->lchild = B->rchild; B->rchild = A; A->bf =原创 2017-10-14 16:07:20 · 1191 阅读 · 0 评论 -
数据结构学习笔记(10)---基于线性表的查找
(1)顺序查找顺序查找比较简单,其思路就是从顺序表的头部或者尾部依次查找数组,直到查找数值为止。其平均查找长度为:ASL = (n+1)/2 代码如下:int SearchByIndex(int* arr,int length,int key){ while (-1 != --length) { if (key == arr[length]) {原创 2017-10-14 16:10:08 · 285 阅读 · 0 评论 -
数据结构学习笔记吧(11)---基于树的查找
(1)二叉排序树定义:该二叉树或者是一棵空树或者是一棵具有下列性质的树: 1. 若他的左子树非空,则左子树上所有节点的值均小于根节点的值 2. 若他的右子树非空,则右子树上所有节点的值均大于(等于)根节点的值 3. 他的左子树与与右子树也分别是二叉排序树二叉排序树的插入思路: 1. 首先判断二叉树是否为空,若为空则可以直接把当做根节点 2. 若非空,则key与根节点进行比较 a.原创 2017-10-14 16:11:02 · 169 阅读 · 0 评论 -
数据结构学习笔记(16)---选择类排序
数据结构学习笔记(16)—选择类排序选择排序思想就是第一次选出关键字最小的的记录作为第一个,然后然后就是除了第一个人元素外再去选取一个人最小的元素放在第二个,依次循环知道全部记录有序为止。但是这样效率会有点低,为了改进算法的效率而又提出了树形选择排序和堆排序,下面进行一一介绍:(1)简单选择排序:选择排序的基本思想:每一趟在n-i+1(i=1,2,3,…,n-1)个记录中选取关键字最小的记录作为有序原创 2017-10-23 00:38:26 · 1079 阅读 · 0 评论 -
数据结构学习笔记(15)---交换类排序
数据结构学习笔记(15)—交换排序交换类排序其实一般就两种,一个就是冒排序,另一个就是快速排序,比较两张算法,肯定是快排效率较高,原因很简单,对于冒泡排序只能与相邻的元素进行比较,互换时候只能消除一个逆序,但是快排通过两个不相邻的元素交换,可以消除待排序记录中的多个逆序,即后面的元素不需要再做无谓的逆序了。(1)冒泡排序比较简单,简单说下算法思路:过程:a. 从第一个记录开始和第二个记录比较,如果大原创 2017-10-22 16:35:38 · 385 阅读 · 1 评论 -
数据结构学习笔记(19) ---图的存储与遍历
(一)图的基本术语 (1)无向完全图:图中任意两个顶点都有边存在则该图为无向完全图,且图的边树数为:n*(n-1)/2 (2)有向完全图:图中任意两点都有方向相反的边则该图为有向完全图,且图的边树数为:n*(n-1) (3)连通图:若力图中任意两个顶点都有路径(即可到达)则成该图为连通的。 (4)连通分量:无向图中的极大连通子图称为该图的连通分量,显然无向连通图的连通分量为其自身。原创 2017-11-04 14:12:48 · 434 阅读 · 0 评论 -
数据结构学习笔记(17)---归并排序与基排序
(1)归并排序算法思想: (1)对于一个人数组,首先把数组平均分为两部分,即[low,mid]和[mid+1,high], (2)分别对左右两部分进行再进行归并排序。 (3)将左右两步部分合并 例如以下例子:开始将数据看成长度为1的有序表,两两归并为长度为2的表,依次类推直到长度为n的有序表 性能分析:平均时间复杂度O(nlogn),空间复杂度O(1),比较稳定代码:void Merge(原创 2017-10-28 14:02:31 · 526 阅读 · 0 评论 -
数据结构学习笔记(18)---B树
(1)什么是B树,其实有一个另外的没名字叫B-树,所以网上说的B-树其实就是B树。B树的定义: (1) 首先B树是一棵平衡的m路查找树,树中每个节点的最多有m个子树。 (2) 根节点最少有两个子树。 (3) 除根节点以外的非叶子结点最少有[m/2]个子树。 (4) 所有叶节点出现在同一层上,并且不含信息,通常称为失败节点,目的是便于分子B树的查找。 好了,满足上述条件就是一个标准的B树了,原创 2017-10-28 17:09:50 · 1427 阅读 · 0 评论 -
数据结构学习笔记(8)---二叉树的层次遍历
二叉树的层序遍历思路:使用队列 ,首先将根节点进队,然后出队并输出,把该节点的左右子树分别入队,直到队列为空时循环结束void LayerOrder(PBiTree root){ queue<PBiTree> q; PBiTree p; if (root == NULL) { return; } q.push(root);原创 2017-09-22 16:43:56 · 230 阅读 · 0 评论 -
数据结构学习笔记(9)---已知二叉树的遍历序列,恢复二叉树
思路:首先我们要了解如何使用二叉树中序序列和先序序列来手动恢复二叉树(1)根据先序序列的第一个节点可得到根节点(2)根据根节点在中序序列中的位置可以将中序序列划分为左右子树(3)根据先序的第二个节点可以将子树划分为左右子树,依次循环下去(4)直到当子树的长度为零时结束//给先序和中序创建二叉树char *PreArray = "abdfgceh"; //先序序列char InArray原创 2017-09-22 17:44:13 · 478 阅读 · 0 评论 -
数据结构学习笔记(2)---双向链表
其实双向链表原理和单向链表原理差不多,只不过是多了一个反向指针,双向链表在操作可以从两个方向进行,即头指针和为指针,这样做得优点是操作就近原则,提高效率。此内容包括:双向链表的初始化创建双向链表用头指针遍历双链表用尾指针遍历双链表按索引查找节点按索引删除节点按索引添加节点(1)双向链表的初始化void InitDoubleList(pDLinkList *pHead, pDLinkL原创 2017-09-13 16:35:44 · 207 阅读 · 0 评论 -
数据结构学习笔记(3)---循环链表(约瑟夫环问题)
最近学习循环链表,其实循环链表的本质和单向链表没有多大区别的,只是在创建时把最后的指针指向头结点,但是当想用循环链表解决约瑟夫环的问题时,要去掉头结点。(1)循环链表的创建void CreateCircleList(pCircleNode pHead){ int date; cout << "请输入节点得值:"; cin >> date; pCircleNode p原创 2017-09-15 13:09:25 · 368 阅读 · 0 评论 -
数据结构学习笔记(4)---静态与动态栈
对于静态栈其实就是一个记录最后一个元素位置的数组,对于动态栈其实就是一个头插法创建链表,因为比较简单,所以就不过多赘述,在这里简单实现以下:(一)静态栈数据结构:typedef struct Stack{ int elem[MAXSIZE]; int top;}StaticStack;(1)栈的初始化void InitStack(StaticStack * s){ s-原创 2017-09-15 14:11:10 · 865 阅读 · 0 评论 -
数据结构学习笔记(5)---静态与动态队列
(一)静态队列数据结构:typedef struct Node{ int date; struct Node *next;}Node, *PNode;typedef struct queue{ PNode top; PNode bottom;}Queue, *PQueue;(1)初始化void InitQueue(Queue *queue){ que原创 2017-09-16 13:46:36 · 1265 阅读 · 0 评论 -
数据结构学习笔记(7)---二叉树递归与非递归遍历
对与二叉树的便遍历有递归遍历与非递归遍历,递归遍历理解起来较简单,容易理解,代码书写简单,但是效率比较低下,对于非递归算法,虽然效率较高但是代码相对对一,且不是那么好容易理解,下面就进行一一解释数据结构typedef struct Tree{ int date; struct Tree* lchild; struct Tree * rchild;}BiTree,*PBiT原创 2017-09-22 16:17:17 · 213 阅读 · 0 评论 -
数据结构学习笔记(6)---二叉树的创建与求深度
对于二叉树的创建其实就是和先序遍历差不多,可以有三种创建二叉树的的方式,即先序创建吗,中序创建和后序创建,但是我一般都是按先序创建的,原因是比较简单容易理解,但是我对于后序与中序创建二叉树好像还没见到过,应该存在但上网查了一下还是,没有呀,这里就只写先序创建二叉树void PreCreatBiTree(PBiTree *root){ int date; cin >> date;原创 2017-09-22 16:38:05 · 176 阅读 · 0 评论 -
数据结构学习笔记(20)---图的应用(生成树与最小生成树)
数据结构学习笔记(20)—图的应用(1)上一篇博客写了图的基本存储于遍历,在此基础上,此篇博客将会介绍图的主要应用—–生成树与最小生成树。(一)生成树定义:我总感觉书上定义比较繁琐,因此就自己简单定义了一下(可能不对哦),生成树其实就是:对于一棵树G,若顶点数为n,则在原来图的基础上把边删除到n-1条边且能连通各点就是生成树。,注意生成树不唯一 例如: 利用遍历方法可以求得生成树,以邻原创 2017-11-04 16:06:49 · 1884 阅读 · 0 评论