数据结构
文章平均质量分 61
岩枭
自强不息,厚德载物
展开
-
顺序表的查找、插入、删除、合并操作及其优缺点
顺序表的查找、插入、删除、合并操作,用c++实现相关代码:#includeusing namespace std;//定义线性表顺序存储结构#define MAXSIZE 100 //线性表最大长度typedef struct{ //线性表占用数组空间 int elem[MAXSIZE]; //记录线性表中最后一个元素在数组elem[]中的位置(下标值),空表置为-1 int last;}Seq原创 2016-05-29 13:43:47 · 3989 阅读 · 0 评论 -
题目:将二叉搜索树转换成一个排序的双向链表。要求不能创建任何新的结点,只能调整树中结点指针的指向
题目:输入一棵二叉搜索树,将该二叉搜索树转换成一个排序的双向链表。要求不能创建任何新的结点,只能调整树中结点指针的指向。比如输入下图中二叉搜索树,则输出转换后的排序双向链表。解析:在二叉搜索树中,每个结点都有两个分别指向其左、右子树的指针,左子树结点的值总是小于父结点的值,右子树结点的值总是大于父结点的值。在双向链表中,每个结点也有两个指针,它们分别指向前一个结点和后一个结点。所以这两原创 2016-07-30 16:05:58 · 7861 阅读 · 2 评论 -
初识STL和容器
STL概念 STL是C++标准库的最重要的组成部分,STL(标准模板库)不仅是一个可复用的组件库,而且是一个包罗算法和数据结构的软件框架。 STL的六大组件1.容器-各种数据结构(vector、list、map、set等);2.迭代器-扮演容器和算法的胶合剂;3.空间配置器-负责内存空间的分配与管理;4.配接器-一种修饰容器或者仿函数或者迭代原创 2016-08-03 22:18:00 · 639 阅读 · 0 评论 -
二叉搜索树的定义、查找、插入和删除
二叉搜索树的定义二叉搜索树,也称有序二叉树,排序二叉树,是指一棵空树或者具有下列性质的二叉树:1. 若任意节点的左子树不空,则左子树上所有结点的值均小于它的根结点的值;2. 若任意节点的右子树不空,则右子树上所有结点的值均大于它的根结点的值;3. 任意节点的左、右子树也分别为二叉查找树。4. 没有键值相等的节点。二叉搜索树的删原创 2016-07-21 21:59:00 · 23665 阅读 · 2 评论 -
剑指offer面试题:二维数组中的查找
二维数组中的查找题目:在一个二维数组中,每一行都按照从左到右递增的顺序排序,每一列都按照从上到下递增的顺序排序。请完成一个函数,输入这样的一个二维数组和一个整数,判断数组中是否含有该整数。 完整代码及测试用例:#includeusing namespace std;// 二维数组matrix中,每一行都从左到右递增排序//原创 2016-08-17 16:08:04 · 413 阅读 · 0 评论 -
题目:输入两个链表,找出它们的第一个公共结点
题目:输入两个链表,找出它们的第一个公共结点。链表的定义如下:struct ListNode{ int m_nValue; ListNode* m_pNext;}; 看到这道题的时候,很多人的第一反应就是采用蛮力的方法:在第一个链表上顺序遍历每个节点,每遍历到一个节点的时候,在第二个链表上顺序遍历每个节点。如果第二个链表上的节点和第一个链表原创 2016-08-05 20:59:35 · 7080 阅读 · 0 评论 -
剑指offer面试题:替换空格
题目:请实现一个函数,把字符串中的每个空格替换成“%20”。例如输入“We are happy.”,则输出“We%20are%20happy.”。解析:时间复杂度为O(n)的解法。完整代码及测试用例实现:#includeusing namespace std;#include //length 为字符数组string的总容量原创 2016-08-17 22:15:06 · 409 阅读 · 0 评论 -
题目:在二叉树中给出两个已知结点,求这两个结点的最低公共祖先
题目:在二叉树中给出两个已知结点,求这两个结点的最低公共祖先 解析:具体实现过程请参考以下代码 完整代码及其测试:#include#includeusing namespace std;//定义二叉树的节点 struct BinaryTreeNode{ char m_nvalue; BinaryTreeNode* m_pleft; BinaryTreeNod原创 2016-08-06 19:21:36 · 535 阅读 · 0 评论 -
剑指offer面试题:输入一个矩阵,按照从外向里以顺时针的顺序依次打印出每一个数字
题目:输入一个矩阵,按照从外向里以顺时针的顺序依次打印出每一个数字。输入一个矩阵如下: 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16则依次打印出数字:1,2,3,4,8,12,16,15,14,13,9,5,6,7,11,10解析:由于题目是以原创 2016-08-19 22:22:29 · 17429 阅读 · 0 评论 -
输入某二叉树的前序遍历和中序遍历的结果,重建该二叉树
题目:输入某二叉树的前序遍历和中序遍历的结果,请重建出该二叉树。假设输入的前序遍历和中序遍历的结果中都不含重复的数字。 思路: 先序遍历的第一个元素为根节点,在中序遍历中找到这个根节点,从而可以将中序遍历分为左右两个部分,左边部分为左子树的中序遍历,右边部分为右子树的中序遍历,进而也可以将先序遍历除第一个元素以外的剩余部分分为两个部分,第一个部分为左子树的先序遍历,第原创 2016-08-09 14:42:27 · 6989 阅读 · 0 评论 -
题目:输入一个链表的头结点,从尾到头反过来打印出每个结点的值
题目:输入一个链表的头结点,从尾到头反过来打印出每个结点的值。解析:思路一:遍历的顺序是从头到尾的顺序,可输出的顺序却是从尾到头。也就是说第一个遍历到的结点最后一个输出,而最后一个遍历到的结点第一个输出。这就是典型的“后进先出”,我们可以用栈实现这种顺序。 每经过一个结点的时候,把该结点放到一个栈中。当遍历完整个链表后,再从栈顶开始逐个输出结点的值,此时输出的结点的顺序原创 2016-08-22 00:50:51 · 6537 阅读 · 0 评论 -
剑指offer面试题:求二叉树的深度
题目:输入一棵二叉树的根结点,求该树的深度。从根结点到叶结点依次经过的结点(含根、叶结点)形成树的一条路径,最长路径的长度为树的深度。例如下图中的二叉树的深度为4,因为它从根结点到叶结点最长的路径包含4个结点(从根结点1开始,经过结点2和结点5,最终到达叶结点7)。 解析:①如果一棵树只有一个结点,它的深度为1; ②如果根结点只有左子树而没有右子树,那么树的深度应原创 2016-08-23 01:29:19 · 788 阅读 · 0 评论 -
题目:输入一棵二叉树的根结点,判断该树是不是平衡二叉树
题目:输入一棵二叉树的根结点,判断该树是不是平衡二叉树。如果某二叉树中任意结点的左右子树的深度相差不超过1,那么它就是一棵平衡二叉树。例如,下图中的二叉树就是一棵平衡二叉树。 解题思路:(1)需要重复遍历节点多次的解法 在上一篇博客中(http://blog.csdn.net/yanxiaolx/article/details/52282776),有了求二叉树的深度原创 2016-08-23 17:05:30 · 4385 阅读 · 0 评论 -
题目:用两个栈实现队列
用两个栈实现队列解析:队列的两个函数分别实现队列尾部插入结点和在队列头部删除结点的功能。具体实现方法和过程,看下面的gif图: 完整代码及测试用例:#include#include using namespace std;template class CQueue{public: CQueue(void); ~CQueue(void); /原创 2016-09-03 22:24:23 · 376 阅读 · 0 评论 -
题目:旋转数组的最小数字
题目:把一个数组最开始的若干个元素搬到数组的末尾,我们称之为数组的旋转。输入一个递增的排序的数组的一个旋转,输出旋转数组的最小元素。例如输入{1,2,3,4,5}的一个旋转为{3,4,5,1,2},该数组的最小值为1。解析:旋转数组的特点:(1)递增排序的数组旋转之后的数组可划分为两个排序的子数组;(2)前面的子数组的元素都大于或等于后面子数组的元素;(3)最小的元素刚好是两个子数原创 2016-09-04 15:51:57 · 493 阅读 · 0 评论 -
项目:文件的压缩与解压
文件压缩开发平台:VS2015开发技术:堆,哈夫曼树项目描述:1.统计文件中字符出现的次数,利用数据结构中的堆建造Huffman树,字符出现次数多的编码短,出现次数少的编码长;2.根据建造好的Huffman树形成编码,以对文件进行压缩;3.将文件中出现的字符以及他们出现的次数写入配置文件,以便后续的解压缩;4.根据配置文件读取相关信息,重建Huffman树,原创 2016-09-07 17:21:11 · 4945 阅读 · 2 评论 -
单链表的逆置
题目:定义一个函数,输入一个链表的头结点,反转该链表并输出反转后链表的头结点。 分析:利用三个指针,分别指向当前遍历到的结点,它的前一个结点和后一个结点,试着找到反转链表的头结点,不难分析出反转后的链表的头结点是原始链表的尾节点。什么结点是尾节点,自然是m_pNext为Null 的结点。具体方法和实现参考如下的代码:#includeusing namespace std;原创 2016-10-05 16:06:26 · 610 阅读 · 0 评论 -
输入数字n,按顺序打印出1到最大的n位十进制数。比如输入3,则打印出1、2、3一直到最大的3位数即999。
题目: 输入数字n,按顺序打印出1到最大的n位十进制数。比如输入3,则打印出1、2、3一直到最大的3位数即999。陷阱:考虑大数问题,就是输入的数字非常大的情况,如100,怎么表示100位的数呢,可以用字符串保存。 细节问题:1.字符串递增的溢出判断2.打印时过滤0 方法一: 使用字符串数组表示大数,最直观的方法是字符串里每个字符都是’原创 2016-07-27 21:55:37 · 4990 阅读 · 0 评论 -
一个推理问题:求老师生日
一个推理问题:求老师生日小明和小强都是张老师的学生,张老师的生日是M月N日, 2人都知道张老师的生日是下列10组中的一天, 张老师把M值告诉了小明,把N值告诉了小强, 张老师问他们知道他的生日是哪一天吗? 3月4日 3月5日 3月8日 6月4日 6月7日 9月1日 9月5日 12月1日 12月2日 12月8日 小明说:如果我不知道的话,小原创 2016-07-16 14:30:35 · 3826 阅读 · 0 评论 -
用c++实现红黑树的判断、插入、遍历操作
红黑树 红黑树是一棵二叉搜索树,它在每个节点上增加了一个存储位来表示节点的颜色,可以是Red或Black。通过对任何一条从根到叶子简单路径上的颜色来约束,红黑树保证最长路径不超过最短路径的两倍,因而近似于平衡。红黑树是满足下面红黑性质的二叉搜索树:1. 每个节点,不是红色就是黑色的;2. 根节点是黑色的;3. 如果一个节点是红色的,则它的两个子节点是黑色的;原创 2016-07-26 22:13:24 · 4885 阅读 · 2 评论 -
单链表的头插、尾插、删除、合并等操作
单链表的头插、尾插、删除、合并等操作实现代码如下:#includeusing namespace std;//单链表的存储结构typedef struct Node{ int data; struct Node* next;}Node,*LinkList;//LinkList为结构指针类型//初始化单链表void InitList(LinkList *L){ *L = (LinkList)mall原创 2016-05-29 13:43:50 · 883 阅读 · 0 评论 -
斐波拉契数列的递归、非递归、公式法多种方法实现
实现斐波拉契数列:1,1,2,3,5,8...,当n>=3时,f(n)=f(n-1)+f(n-2)。解:求解斐波拉契数列方法很多,这里提供了4种实现方法和代码,由于第5种数学公式方法代码太过繁琐,只做简单介绍方法一:递归调用,每次递归的时候有大量重复计算,效率低,可将其调用的过程转化成一颗二叉树进行分析,二叉树的总结点个数不超过(2^n-1)个,由于其是不完全二叉树,那么函数计算的次数必小于(2^原创 2016-05-29 13:43:53 · 3794 阅读 · 0 评论 -
顺序栈的基本操作:初始化、进栈、出栈、读栈顶元素
顺序栈:利用一组地址连续的存储单元依次存放自栈底到栈顶的数据元素,同时由于栈操作的特殊性,还必须附设一个位置指针top(栈顶指针)来动态地指示栈顶元素在顺序栈中的位置。通常以top=-1表示空栈。代码如下:#includeusing namespace std;#define TRUE 1#define FALSE 0//顺序栈的存储结构#define Stack_Size 50 //设栈中元原创 2016-05-29 13:43:59 · 24433 阅读 · 5 评论 -
多栈共享技术,双端栈的初始化、进栈、出栈操作
栈的应用非常广泛,经常会出现一个程序中需要同时使用多个栈的情况。若使用顺序栈,会因为对栈空间大小难以准确估计,从而产生有的栈溢出、有的栈空间还很空闲的情况。为了解决这个问题,可以让多个栈共享一个足够大的数组空间,通过利用栈的动态特性来使其存储空间互相补充,这就是多栈的共享技术。 在顺序栈的共享技术中,最常用的是两个栈的共享技术,即双端栈。它主要利用了栈的栈底位置不变,而栈顶位置动态变化的特性原创 2016-05-29 13:44:02 · 2490 阅读 · 0 评论 -
链队列的初始化、入队、出队等操作实现
链队列的初始化、入队、出队等基本操作实现代码如下:#includeusing namespace std;#define TRUE 1#define FALSE 0//链队列定义typedef struct Node{ int data;//数据域 struct Node *next;//指针域}LinkQueueNode;typedef struct { LinkQueueNode *fro原创 2016-05-29 13:44:04 · 7683 阅读 · 0 评论 -
循环队列的初始化、入队、出队等基本操作
循环队列的初始化、入队、出队等基本操作,实现代码如下:#includeusing namespace std;#define TRUE 1#define FALSE 0//循环队列的类型定义#define MAXSIZE 50//队列的最大长度typedef struct{ int element[MAXSIZE];//队列的元素空间 int front;//头指针指示器 int rear;//尾原创 2016-05-29 13:44:07 · 18944 阅读 · 2 评论 -
链栈的基本操作
链栈的基本操作实现代码如下:#includeusing namespace std;#define TRUE 1#define FALSE 0//链栈的结构typedef struct node{ int data; struct node *next;}LinkStackNode;typedef LinkStackNode *LinkStack;//链栈进栈int Push(LinkStack原创 2016-05-29 13:44:10 · 972 阅读 · 0 评论 -
多栈运算
多栈运算的算法思想:将多个链栈的栈顶指针放在一个一维指针数组中来统一管理,从而实现同时管理和使用多个栈。650) this.width=650;" src="http://s1.51cto.com/wyfs02/M02/80/04/wKioL1c0jzjBUGYkAAAjsxAXniU553.png" title="图片1.png" alt="wKioL1c0jzjBUGYkAAAjsxAXniU原创 2016-05-29 13:44:13 · 944 阅读 · 0 评论 -
汉诺塔问题的递归解法
650) this.width=650;" src="http://s3.51cto.com/wyfs02/M00/80/04/wKioL1c0mLOj9UFaAAMmSLBAO4U112.png" title="捕获.PNG" alt="wKioL1c0mLOj9UFaAAMmSLBAO4U112.png" />汉诺塔问题的递归解法:实现程序:#includeusing namespace st原创 2016-05-29 13:44:15 · 464 阅读 · 0 评论 -
二分查找算法的递归、循环实现及其缺陷
关于二分查找法 在学习算法的过程中,我们除了要了解某个算法的基本原理、实现方式,更重要的一个环节是分析算法的复杂度。在时间复杂度和空间复杂度之间,我们又会更注重时间复杂度,往往用牺牲空间换时间的方法提高时间效率。时间复杂度按优劣排差不多集中在:O(1), O(log n), O(n), O(n log n), O(n2), O(nk), O(2n)二分查找法主要是解决在“一堆数中找出指定原创 2016-05-29 13:44:21 · 2310 阅读 · 0 评论 -
稀疏矩阵的列序递增法和一次定位快速转置法
稀疏矩阵:矩阵中大多数元素为0的矩阵,从直观上讲,当非零元素个数低于总元素的30%时,这样的矩阵为稀疏矩阵。如:int array [6][5] = {{1, 0, 3, 0, 5}, {0, 0, 0, 0, 0},原创 2016-05-29 13:44:24 · 2669 阅读 · 0 评论 -
二叉树的先序、中序、后序遍历等基本操作c++实现
二叉树:树的每个节点最多有两个子节点。1.实现二叉链表的结构://节点结构templatestruct BinaryTreeNode{ BinaryTreeNode* _left;//左子树 BinaryTreeNode* _right;//右子树 T _data;//数据域 //构造函数 BinaryTreeNode(const T& x) :_left(NULL)//左孩子指针 ,_ri原创 2016-05-29 13:44:27 · 883 阅读 · 0 评论 -
用c++实现二叉树的线索化
二叉树的线索化,先序、中序,测试用例实现源代码:#includeusi原创 2016-05-30 16:59:40 · 1651 阅读 · 0 评论 -
在一个字符串中找到第一个只出现一次的字符。如输入:abcdab,则输出:c。
题目:在一个字符串中找到第一个只出现一次的字符。如输入:abcdab,则输出:c。 分析:看到这道题时,有两种思路:(1)最直观的想法是从头开始扫描这个字符串中的每个字符。当访问到某字符时拿这个字符和后面的每个字符相比较,如果在后面没有发现重复的字符,则该字符就是只出现一次的字符。如果字符串有n个字符,每个字符可能与后面的O(n)个字符相比较,因此这种思路时间复杂度是O(n^2)。博主原创 2016-06-02 22:47:42 · 7902 阅读 · 0 评论 -
冒泡排序算法及其两种优化
冒泡排序算法及其两种优化1、排序方法 将被排序的记录数组R[1..n]垂直排列,每个记录R[i]看作是重量为R[i].key的气泡。根据轻气泡不能在重气泡之下的原则,从下往上扫描数组R:凡扫描到违反本原则的轻气泡,就使其向上"飘浮"。如此反复进行,直到最后任何两个气泡都是轻者在上,重者在下为止。(1)初始 R[1..n]为无序区。(2)第一趟扫描原创 2016-06-09 18:08:43 · 36871 阅读 · 9 评论 -
剑指offer面试题:求二叉树的镜像(递归、循环解法及测试用例)
题目:给定二叉树,将其变换为源二叉树的镜像。二叉树的定义如下:struct TreeNode{ int val; TreeNode* left; TreeNode* right;};输入描述:二叉树的镜像定义: 源二叉树 8 / \ 6 10 / \原创 2016-07-25 01:34:25 · 4679 阅读 · 0 评论 -
用两个队列模拟实现一个栈的过程
栈具有“后进先出”的特点,即某个元素最后进入栈,却最先出栈;队列具有“先进先出”的特点,即元素从队尾依次进队列,依次从队头出队列;现在用两个队列模拟实现一个栈的过程,详细过程请看下面这张本人制作的gif图:650) this.width=650;" src="http://s4.51cto.com/wyfs02/M02/82/0E/wKioL1dJjbLBs09rAALQGkmi570447.gi原创 2016-05-29 13:44:36 · 2313 阅读 · 3 评论