数据结构
文章平均质量分 79
snow_5288
三天不读书,智商输给猪
展开
-
二叉树的非递归遍历
上篇文章我们实现了二叉树原创 2016-12-25 17:28:36 · 2716 阅读 · 0 评论 -
【排序一】插入排序(直接插入排序&&希尔排序)
一、排序的分类原创 2017-03-01 15:08:43 · 2157 阅读 · 8 评论 -
【排序二】选择排序(选择排序&&堆排序)
【排序一】插入排序一、选择排序1、基本思想 顾名思义,选择排序就是每次选一个数据放到其应该出现的位置,以升序(降序)为例,首先选最小(最大)的数据放到正确位置,接着再选次小(次大)的数据放到合适的位置,以此类推,直到最大(最小)的数据被放入最后一个位置,排序就算完成。总体算法分三步完成:选数据--->将所选数据放入合适位置--->缩小需要排序的范围图解原创 2017-03-01 20:27:47 · 1405 阅读 · 1 评论 -
经典大数据面试题
什么是大数据?大数据(big data,mega data),或称巨量资料,指的是需要新处理模式才能具有更强的决策力、洞察力和流程优化能力的海量、高增长率和多样化的信息资产。 在维克托·迈尔-舍恩伯格及肯尼斯·库克耶编写的《大数据时代》中大数据指不用随机分析法(抽样调查)这样的捷径,而采用所有数据进行分析处理。大数据的4V特点:Volume(大量)、Velocity(高速)、Variety(多原创 2017-02-22 22:59:49 · 5976 阅读 · 0 评论 -
二叉树的线索化
测试环境:VS2010 一、线索二叉树的引入 二叉树是一种非线性结构,遍历二叉树几乎都是通过递归或者用栈辅助实现非递归的遍历。用二叉树作为存储结构时,取到一个节点,只能获取节点的左孩子和右孩子,不能直接得到节点的任一遍历序列的前驱或者后继。 为了保存这种在遍历中需要的信息,我们利用二叉树中指向左右子树的空指针来存放节点的前驱和后继信息。原创 2016-12-31 19:33:09 · 3109 阅读 · 0 评论 -
【排序4】归并排序
【排序一】插入排序(直接插入排序&&希尔排序)【排序二】选择排序(选择排序&&堆排序)【排三】交换排序(冒泡排序&&序快速排序)一、归并排序1、基本思想 归并排序(Merge sort,台湾译作:合并排序)是建立在归并操作上的一种有效的排序算法。该算法是采用分治法(Divide and Conquer)的一个非常典型的应用。算法原理:1>原创 2017-03-06 18:02:29 · 980 阅读 · 0 评论 -
【排序五】非比较排序(计数排序&&基数排序)
比较排序:【排序一】插入排序(直接插入排序&&希尔排序)【排序二】选择排序(选择排序&&堆排序)【排序三】交换排序(冒泡排序&&快速排序)【排序四】归并排序一、计数排序1、基本思想 给定一组要排序的序列,找出这组序列中的最大值,然后开辟一个最大值加1大小的数组,将这个数组里面的元素全部置零,然后用这个数组统计出要排序的序列中各个元素出现的次数原创 2017-03-06 22:39:30 · 995 阅读 · 0 评论 -
【排序三】交换排序(冒泡排序&&快速排序)
【排序一】插入排序(直接插入排序&&希尔排序)【排序二】选择排序(选择排序&&堆排序)一、冒泡排序1、基本思想 冒泡排序(Bubble Sort,台湾译为:泡沫排序或气泡排序)是一种简单的排序算法。为什么会叫做冒泡排序呢?这是由于它的算法思想就类似于鱼儿在河里吐泡泡的场景,例如升序排列一列数,它会两两相邻的数据进行比较,如果前者大于后者就交换,重复此番工作直到交换到最后两原创 2017-03-04 21:45:07 · 9962 阅读 · 5 评论 -
求两个节点的最近公共祖先多种解法&&判断一个节点是否在二叉树中
#pragma once#include <iostream>#include <cassert>#include <stack>#include <vector>using namespace std;template <typename T>struct TreeNode{ T _data; //节点的数据 TreeNode<T>* _l原创 2017-04-12 19:26:46 · 841 阅读 · 0 评论 -
简易内存池
【内存池的引入】 一般的,我们要动态申请内存时,都会调用malloc或new,由于需要申请的内存大小可能预先不知道,所以有时文门会频繁的调用malloc或new,这就大大降低了程序的运行速率,同时还有可能引进内碎片问题。基于上述原因,引入了内存池的概念。 【什么是内存池】 内存池是一种内存分配方式。通俗一点说,内存池就是存放内存的池子。它可以不有效的减少内存碎原创 2017-04-17 21:21:21 · 802 阅读 · 0 评论 -
数据结构之用两个队列实现一个栈
一、了解栈和队列的基本结构1、栈定义:栈是一种只能在一端进行插入或删除操作的线性表。允许插入和删除的一端被称为栈顶(动态变化),另一端被称为栈底(固定不变),栈的插入和删除被分别称作入栈和出栈。特点:先进后出(FILO)。存储结构:顺序栈和链式栈。2、队列定义:队列为一种只允许在表的一端进行插入,在一端进行删除的受限制的线性表。允许插入的一端叫做队尾,允许删原创 2017-04-10 11:33:06 · 1143 阅读 · 0 评论 -
栈和队列的常见面试题
1、两个队列实现一个栈 两个队列实现一个栈2、两个栈实现一个队列 【算法思想】 1>设计类 成员变量:给两个栈s1和s2来模拟实现一个队列 成员函数:入队Push()和出队Pop() 2>给两个指向栈对象s1、s2的指针input和output,分别用来入队和出队 3>按照先进先出的方式模拟入队和出队操作 Push:将input指向不空的栈,然后在input中入队 Pop:将inp原创 2017-05-04 14:06:43 · 3836 阅读 · 0 评论 -
二叉树的经典面试题总结
1、二叉树的构造 2、遍历二叉树 3、求二叉树的高度(深度) 4、求二叉树中节点的个数 5、求二叉树中叶子节点的个数 6、求二叉树第K层的节点个数7、判断一个节点是否在二叉树中 8、求两个节点的最近公共祖先9、判断一棵二叉树是否是平衡二叉树10、求二叉树中最远的两个节点的距离 11、由前序遍历和中序遍历重建二叉树12、判断一棵树是否是完全二叉树13、求二叉树的镜像14、二叉搜索树->有序双链表原创 2017-05-04 16:20:45 · 9135 阅读 · 1 评论 -
(C语言)顺序表之动态实现
点击打开链接(静态实现版)头文件:#define _CRT_SECURE_NO_WARNINGS 1#ifndef _SEQLIST_H__#define _SEQLIST_H__#include#include#include#include#define MAX 2#define CHANGE_MAX 2typedef int TYPE;typedef stru原创 2016-06-01 18:36:38 · 1114 阅读 · 0 评论 -
(C语言)自拟顺序表的各种操作
总是要进步的。。。原创 2016-05-27 23:00:50 · 637 阅读 · 0 评论 -
Can you use map and set???
一、map和set的引入 我们都知道,STL在C++ 中得到了广泛使用,它不仅仅由于是提供了类似vector,list等方便使用的容器,更是因为它封装了许多复杂的数据结构算法和大量数据结构的操作。vector封装数组,list封装链表,而map和set则是用来封装二叉树的。 还有要知道的就说STL中的容器分为两大类:序列式容器和关联式容器,其中vector和li原创 2017-02-16 12:57:38 · 886 阅读 · 4 评论 -
树&&二叉树(递归实现)
1、树的定义2、树的基本术语3、树的存储结构1、二叉树的定义2、二叉树的5种基本状态3、满二叉树与完全二叉树4、二叉树的主要性质5、二叉树的存储结构6、二叉树的遍历7、代码模拟二叉树(递归)原创 2016-12-17 19:51:56 · 3496 阅读 · 0 评论 -
数据结构之广义表模拟
测试环境:VS2010 广义表是一种非线性的结构,是线性表的一种扩展,是有n个元素组成有限序列。广义表的定义是递归的,因为在表的描述中又得到了表,允许表中有表。eg: A = () B = (a,b) C = (a,b,(c,d)) D = (a,b,(c,d),(e,(f),h)) E = (((),()))存储结构:原创 2016-12-15 09:18:41 · 10544 阅读 · 0 评论 -
C++实现矩阵压缩存储与(快速)转置
注意:以下所有代码均在VS2010环境下运行测试 了解了C语言以后,我们都知道,要存储一个矩阵,用一个二维数组即可实现,今天,由我来带领大家玩点新鲜的,对矩阵进行压缩存储并对其进行转置。一、对称矩阵及对称矩阵的压缩存储1、什么是对称矩阵? 设一个N*N的方阵A,A中任意元素Aij,当且仅当Aij == Aji(0 && 0原创 2016-12-10 19:05:00 · 12698 阅读 · 1 评论 -
迷宫求解
话不多说,直接贴代码:(一)运行迷宫:0表示通路,1表示墙,红色的0表示入口,绿色的一行表示出口1 1 1 1 1 1 1 1 1 11 1 1 1 1 1 1 1 1 10 0 0 1 1 1 1 1 1 11 1 0 1 1 1 1 1 1 11 1 0 1 1 1 1 1 1 11 1 0 1 1 1 1 1 1 11 1 0 0 0 0 0 0 1 11 1 0 1原创 2016-12-04 22:41:24 · 6899 阅读 · 1 评论 -
C++模拟双向链表的基本操作
双向链表也叫双链表,是链表的一种,它的每个数据结点中都有两个指针,分别指向直接后继和直接前驱。所以,从双向链表中的任意一个结点开始,都可以很方便地访问它的前驱结点和后继结点。一般我们都构造双向循环链表。双(向)链表中有两条方向不同的链,即每个结点中除next域存放后继结点地址外,还增加一个指向其直接前趋的指针域pre。双向链表在查找时更方便 特别是大量数据的遍历原创 2016-10-21 12:32:52 · 3837 阅读 · 0 评论 -
C++实现动态顺序表
#includeusing namespace std;#include#define DataType intclass Seqlist { friend ostream& operator<<(ostream &_cout,const Seqlist& s);public: Seqlist(); Seqlist(DataType arr[],size_t size);原创 2016-10-20 22:57:23 · 3423 阅读 · 0 评论 -
将链表的所有奇数元素放于偶数元素前面
具体要求:头文件:#pragma once#include#include#includetypedef int DataType;typedef struct Node{ DataType data; struct Node *next;}*PNode,Node;void ParityRearrangement(PNode *pHead)原创 2016-09-22 23:30:40 · 3989 阅读 · 0 评论 -
复杂链表的复制
什么是复杂链表?答:每个节点包含两个指针域(next.random)和一个数据域(data),其中next指向下一个节点,而random可指向链表的任意节点(包括它本身)甚至NULL。以下面的例子为例进行复制:代码实现:#include#include#includetypedef int DataType;typedef struct ComplexN原创 2016-09-20 14:03:36 · 661 阅读 · 0 评论 -
链表中的带环相交问题
PNode CheckCircle(PNode pHead);//判断链表是否带环int GetCircleLength(PNode pMeetNode);//如果带环,求环的长度PNode GetInterNode(PNode pHead,PNode pMeetNode);//获取环的入口点int CheckCrossWithCircle(PNode pHead1,PNode pHead2);//判断链表是否相交(有可能带环)PNode UnionSet(Node *list1,Node *lis原创 2016-09-19 23:18:06 · 1199 阅读 · 0 评论 -
单链表的逆置,排序,合并有序链表,不带环相交
PNode Reserse_LinkList(PNode *pHead);//逆置单链表void Bubbleort(PNode pHead);//冒泡排序PNode MergeOrder_LinkList(PNode pList1,PNode pList2);//合并两个有序链表,合并后仍有序int CheckCross(PNode pList1,PNode pList2);//判断链表是否相交PNode Cross(PNode pList1,PNode pList2);//求两个链表相交的交点原创 2016-09-17 19:34:17 · 1174 阅读 · 0 评论 -
链表面试题逆序打印,删除无头非尾节点,非头位置插入,约瑟夫环,查找中间和倒数第k个节点
PNode EndNode(PNode *pHead);//返回最后一个节点void ReversePrint(PNode pHead);//逆序打印链表void DeleteNotTail(PNode pos);//删除无头非尾节点void InsertNotHead(PNode *pHead,PNode pos,DataType data);//在链表的非头位置插入节点PNode JosephCircle(PNode *pHead,int m);//约瑟夫环PNode FindMidNode(原创 2016-09-15 20:16:59 · 6128 阅读 · 0 评论 -
单链表的基本操作
void Init_LinkList(PNode *pHead);//初始化PNode BuyNode(DataType data);//创建新节点void PushBack(PNode *pHead,DataType data);//尾插void PopBack(PNode *pHead);//尾删void PushFront(PNode *pHead,DataType data);//头插void PopFront(PNode *pHead);//头删PNode Find(PNode pHe原创 2016-09-13 12:31:54 · 1039 阅读 · 0 评论 -
快速排序的三种实现及两种优化
一、快速排序的概念快速排序(Quicksort)是对冒泡排序的一种改进。快速排序由C. A. R. Hoare在1962年提出。它的基本思想是:通过一趟排序将要排序的数据分割成独立的两部分,其中一部分的所有数据都比另外一部分的所有数据都要小,然后再按此方法对这两部分数据分别进行快速排序,整个排序过程可以递归进行,以此达到整个数据变成有序序列。二、快排的三种实现方式实现方式一:左右指针法 算法思想:原创 2017-08-05 20:52:05 · 6916 阅读 · 0 评论