数据结构
文章平均质量分 76
poison_biti
这个作者很懒,什么都没留下…
展开
-
求二叉树中最远的两个节点的距离
求两个节点之间最远的距离: (1)两个节点都是叶子结点 (2)一个是叶子结点一个是根节点思路: (1)如果具有最远距离的两个节点经过了根节点,那么最远的距离就是左边最深的深度加上右边最深的深度之和。 (2)如果具有最远距离的两个节点之间的路径不经过根节点,那么最远的距离就在根节点的其中一个子树上的两个叶子结点。 i原创 2017-07-22 18:40:03 · 4113 阅读 · 0 评论 -
堆应用——堆排序
"test.cpp"#includeusing namespace std;#includevoid AdjustDown(int* arr,size_t size,size_t root){ size_t parent = root; size_t child = 2*parent+1; while(child < size) { if(child+1 arr[ch原创 2016-10-12 23:50:24 · 680 阅读 · 0 评论 -
遍历二叉树——递归遍历
“test.cpp”#includeusing namespace std;templatestruct BinaryTreeNode{ T _data; BinaryTreeNode* _left; BinaryTreeNode* _right; BinaryTreeNode(const T& data = T()) :_data(data) ,_left(NUL原创 2016-09-26 23:03:07 · 969 阅读 · 0 评论 -
堆结构——最大堆
“test.cpp”#includeusing namespace std;#includetemplateclass Heap{public: Heap(T* arr,size_t size) { _arr.reserve(size); for(size_t i = 0;i < size;i++) { _arr.push_back(arr[i]);原创 2016-10-11 11:15:06 · 529 阅读 · 0 评论 -
广义表——递归入门
“test.cpp”#includeusing namespace std;#includeenum Type{ HEAD, SUB, VALUE,};struct GeneralizedListNode{ Type _type; GeneralizedListNode* _next; //union //{ char _value; Generaliz原创 2016-09-25 00:05:42 · 793 阅读 · 0 评论 -
稀疏矩阵的(普通/快速)转置
“test.cpp”#includeusing namespace std;#includetemplatestruct Triple{ size_t _row; size_t _col; T _value; Triple(size_t row = 0,size_t col = 0,const T& value = T()) :_row(row) ,_col(co原创 2016-09-24 15:21:39 · 796 阅读 · 0 评论 -
顺序表——迭代器
"test.cpp"#includeusing namespace std;templateclass Vector{public: typedef T* Iterator; typedef const T* ConstIterator; Vector() :_start(NULL) ,_finish(NULL) ,_endofstorage(NULL) {}原创 2016-09-21 14:24:23 · 352 阅读 · 0 评论 -
图——邻接表
邻接表:邻接表是图的一种链式存储结构。对图的每个顶点建立一个单链表(n个顶点建立n个单链表),第i个单链表中的结点包含顶点Vi的所有邻接顶点。又称链接表。“test.cpp”#define _CRT_SECURE_NO_WARNINGS 1#includeusing namespace std;#include "GraphLink.h"void Test(){ Gr原创 2016-09-07 13:06:51 · 306 阅读 · 0 评论 -
对称矩阵的压缩存储
“test.cpp”#includeusing namespace std;templateclass SymmetricMatrix{public: SymmetricMatrix(T* a,size_t n) :_n(n) ,_size(n*(n+1)/2) ,_matrix(new T[n*(n+1)/2]) { size_t index = 0; f原创 2016-09-20 11:26:52 · 876 阅读 · 0 评论 -
稀疏矩阵的压缩存储
“test.cpp”#includeusing namespace std;#includetemplatestruct Triple{ size_t _row; size_t _col; T _value; Triple(size_t row = 0,size_t col = 0,const T& value = T()) :_row(row) ,_col(co原创 2016-09-20 12:09:06 · 429 阅读 · 0 评论 -
贪吃蛇——C++经典小游戏
贪吃蛇的游戏规则:上下左右方向键控制贪吃蛇游动,不要撞到墙、不要碰到自己身体,每次吃到食物速度都会加快。原创 2016-09-22 23:31:59 · 3425 阅读 · 1 评论 -
图——邻接矩阵
邻接矩阵:用一个一维数组存放图中所有顶点数据;用一个二维数组存放顶点间关系(边或弧)的数据,这个二维数组称为邻接矩阵。用邻接矩阵表示图,很容易确定图中任意两个顶点是否有边相连。邻接矩阵分为有向图邻接矩阵和无向图邻接矩阵。对无向图(无向简单图)而言,邻接矩阵一定是对称的,而且对角线一定为零,有向图则不一定如此。“test.cpp”#define _CRT_SECURE_NO_WARN原创 2016-09-06 21:54:38 · 5372 阅读 · 0 评论 -
一个数组实现两个栈——栈和队列面试题(5)
题目要求:一个数组实现两个栈"test.cpp"#includeusing namespace std;#includetemplateclass ArrayTwoStack{public: ArrayTwoStack() :_capacity(2) ,_top1(-1) ,_top2(_capacity) ,_size1(0) ,_size2(原创 2016-09-19 00:23:05 · 592 阅读 · 0 评论 -
元素出入栈的合法性——栈和队列面试题(4)
题目要求:元素的出,入栈顺序的合法性。如入栈{1,2,3,4,5,},出栈{4,5,3,2,1}"test.cpp"#includeusing namespace std;#include#includebool IsLegalOrder(int* arr1,int size1,int* arr2,int size2){ assert(arr1); assert(a原创 2016-09-18 22:53:10 · 416 阅读 · 0 评论 -
两个队列实现一个栈——栈和队列面试题(3)
题目要求:用两个队列实现一个栈,实现栈的内部函数“test.cpp”#includeusing namespace std;#includetemplateclass TwoQueueFromStack{public: TwoQueueFromStack(){} void Push(const T& data) { if(FirstQueue.empty(原创 2016-09-18 19:13:07 · 337 阅读 · 0 评论 -
遍历二叉树——非递归遍历
“test.cpp”#includeusing namespace std;#include#includetemplatestruct BinaryTreeNode{ T _data; BinaryTreeNode* _left; BinaryTreeNode* _right; BinaryTreeNode(const T& data = T()) :_data(原创 2016-09-28 14:14:48 · 565 阅读 · 0 评论 -
高度平衡二叉树——AVL树
“test.cpp”#includeusing namespace std;templatestruct AVLTreeNode{ AVLTreeNode* _left; AVLTreeNode* _right; AVLTreeNode* _parent; K _key; V _value; int _bf; AVLTreeNode(const K& key,con原创 2016-10-25 13:07:30 · 737 阅读 · 0 评论 -
求两个节点最近的公共祖先
(1)如果这棵树是二叉搜索树 二叉搜索树是排序过的,位于左子树的节点的值比当前节点的值小,而位于右子树的节点的值都比当前节点的值大。我们只需要从树的根节点开始和两个输入的节点进行比较。 (1)如果当前节点的值比两个节点的值都大,那么最近公共祖先一定在当前节点的左子树里。于是下一步遍历当前节点的左子树的节点。 (2)如果当前节点的值比两个节点的值都小,那么最近公共祖原创 2017-07-21 22:00:58 · 2332 阅读 · 0 评论 -
huffman树的应用——文件压缩
简述:利用哈夫曼编码进行文件的压缩和解压缩。开发环境:windows,VS2013,C++项目特点: 压缩文件:读取文件中的字符,将其转化为哈弗曼编码,再通过位转化为压缩文件。 解压缩文件:从配置文件中读取字符及对应字符的出现次数建立哈夫曼树,得到解压缩文件中的字原创 2017-07-02 14:46:35 · 600 阅读 · 0 评论 -
LRU缓存算法
为什么要有LRU缓存算法我们用缓存来存放以前读取的数据,而不是直接丢掉,这样,再次读取的时候,可以直接在缓存里面取,而不用再重新查找一遍,这样系统的反应能力会有很大提高。但是,当我们读取的个数特别大的时候,我们不可能把所有已经读取的数据都放在缓存里,毕竟内存大小是一定的,我们一般把最近常读取的放在缓存里。现在,我们就来研究这样一种缓存机制——LRU缓存。LRU缓存:LR原创 2017-06-22 09:36:08 · 763 阅读 · 0 评论 -
图——最小生成树
“test.cpp”#includeusing namespace std;#include#include#include#include "Heap.h"#include "UnionFindFet.h"templateclass GraphLink{public: struct Node { W _w; size_t _src; size_t _ds原创 2016-12-03 11:51:07 · 432 阅读 · 0 评论 -
哈希表——直接定址法
“test.cpp”#includeusing namespace std;#includeenum Status{ EMPTY, EXIST, DELETE,};templatestruct HashTableNode{ K _key; V _value; Status _status; HashTableNode(const K& key = K(),c原创 2016-11-01 21:02:45 · 2134 阅读 · 0 评论 -
平衡二叉树——红黑树
“test.cpp”#includeusing namespace std;enum COLOUR{ BLACK, RED,};templatestruct RBTreeNode{ K _key; V _value; COLOUR _col; RBTreeNode* _left; RBTreeNode* _right; RBTreeNode* _parent;原创 2016-10-30 21:23:57 · 480 阅读 · 0 评论 -
动态规划——最长公共子序列
“test.cpp”#includeusing namespace std;#include#include#includevoid test(){ string str1 = "ABCBDAB"; string str2 = "BDCABA"; size_t x_len = str1.length(); size_t y_len = str2.length();原创 2016-11-09 22:01:34 · 480 阅读 · 0 评论 -
网易秋招编程题——翻转数字
“test.cpp”#includeusing namespace std;int rev(int x){ int tmp = 0; while(x > 0) { tmp = tmp * 10 + x % 10; x = x / 10; } return tmp;}void test(){ int x = 0; int y = 0; cin>>x>>y;原创 2016-10-18 14:31:42 · 413 阅读 · 0 评论 -
查找树——搜索二叉树(非递归)
“test.cpp”#includeusing namespace std;templatestruct SearchBinaryTreeNode{ SearchBinaryTreeNode* _left; SearchBinaryTreeNode* _right; K _key; SearchBinaryTreeNode(const K& key) :_left(NU原创 2016-10-18 14:08:27 · 760 阅读 · 0 评论 -
布隆过滤器
“test.cpp”#include using namespace std;#include "BloomFilter.h"#include void test(){ char* str1 = "1ile:///C:/Users/xjh/AppData/Local/Temp/360zip$Temp/360$0/%E5%AD%97%E7%AC%A6%E4%B8%B2%E5%93%原创 2016-11-08 12:38:40 · 683 阅读 · 0 评论 -
两个栈实现一个队列——栈和队列面试题(2)
题目要求:规定用两个栈实现一个队列,实现内部函数"test.cpp"#includeusing namespace std;#includetemplateclass TwoStackFromQueue{public: TwoStackFromQueue(){} void Push(const T& data) { if(PushStack.empty()原创 2016-09-18 18:20:02 · 316 阅读 · 0 评论 -
二分查找——递归与非递归
二分查找又称折半查找,优点是比较次数少,查找速度快,平均性能好;其缺点是要求待查表为有序表,且插入删除困难。因此,折半查找方法适用于不经常变动而查找频繁的有序列表。首先,假设表中元素是按升序排列,将表中间位置记录的关键字与查找关键字比较,如果两者相等,则查找成功,返回当前位置下标;否则利用中间位置记录将表分成前、后两个子表,如果中间位置记录的关键字大于查找关键字,则进一步查找前一子表,否则进一步查原创 2016-09-06 11:46:17 · 843 阅读 · 0 评论 -
遍历二叉树——递归和非递归(栈和队列的应用)实现
"BinaryTree.h"#pragma once#include #include templateclass BinaryTreeNode{public: T _date; BinaryTreeNode* _left; BinaryTreeNode* _right;public: BinaryTreeNode(const T& date原创 2016-07-06 14:24:52 · 1051 阅读 · 1 评论 -
数字三角形——递归求解
一个数字三角形。从三角形的顶部到底部有很多条不同的路径。对于每条路径,把路径上面的数加起来可以得到一个和,和最大的路径称为最佳路径。任务就是求出最佳路径上的数字之和。注意:路径上的每一步只能从一个数走到下一层上和它最近的左边的数或者右边的数。 以下是代码实现#include using namespace std;#define MAX 100int Arr原创 2016-07-06 13:19:24 · 3614 阅读 · 0 评论 -
遍历二叉树——递归实现
二叉树是面试官经常考的面试题,只要熟悉了二叉树的结构,就能很轻松的对付各种问题原创 2016-07-03 14:06:17 · 412 阅读 · 0 评论 -
顺序表的基本操作——静态实现
"SeqList.h"#ifndef __SEQLIST_H__//防止重定义#define __SEQLIST_H__#include #include #include #include #define MAX 5typedef int DataType;//typedef语句后面要有一个分号;typedef struct SeqList{原创 2016-05-28 15:39:49 · 607 阅读 · 0 评论 -
通讯录——静态实现
"AddRess.h"#ifndef __ADDRESS_H__#define __ADDRESS_H__#include #include #include #include #define MAX 10 //这里我为了调试方便取了一个较小的数值enum OP{ EXIT = 0,//退出 ADD, //增加联系人 DEL,原创 2016-05-28 15:41:42 · 547 阅读 · 0 评论 -
双向链表——基本操作
"test.c"#define _CRT_SECURE_NO_WARNINGS 1#include "DoubleSLishtNode.h"void Test1()//InitDSList PushBack PrintfDSList PopBack{ PDoubleSListNode pHead = NULL; InitDSList(&pHead); Pus原创 2016-06-02 13:43:23 · 609 阅读 · 0 评论 -
单链表的简单面试题
#define _CRT_SECURE_NO_WARNINGS 1#include "SListNode.h"void Test1()//PushBack PopBack{ PSListNode pHead = NULL; InitList(&pHead); PushBack(&pHead,0); PushBack(&pHead,1); PushBack(&原创 2016-06-12 22:46:56 · 689 阅读 · 0 评论 -
栈的基本操作——顺序栈的类模板定义
栈和队列都是特殊的线性表,是限制存取位置的线性结构;可以由顺序表实现,也可以由链表实现。什么是栈栈定义为:只允许在表的一端进行插入和删除的线性表。允许进行插入和删除的一端叫做栈顶(top),而另一端叫栈底(bottom)。栈中没有任何元素时,称为空栈。设给定栈s=(a0,a1,……,an-1),称a0为栈底,an-1为栈顶。栈又称作后进先出(LIFO:Last In First O原创 2016-06-13 15:09:56 · 2051 阅读 · 0 评论 -
队列的基本操作——链式队列的类模板定义
定义 队列(Queue)是只允许在一端进行插入,而在另一端进行删除的运算受限的线性表 (1)允许删除的一端称为队头(Front)。 (2)允许插入的一端称为队尾(Rear)。 (3)当队列中没有元素时称为空队列。 (4)队列亦称作先进先出(First In First Out)的线性表,简称为FIFO表。 队列的修改是依先进先出的原则进行的。新来的成原创 2016-06-13 17:16:53 · 1017 阅读 · 0 评论 -
排序(2)——插入/希尔/选择/快速排序及优化
"Sort.h"#pragma once#include using namespace std;#include #include void InsertSort(int* arr,size_t size)//直接插入排序{ assert(arr); for (int i = 1;i < size;i++) { int j = i-1; i原创 2016-06-16 16:26:11 · 392 阅读 · 0 评论 -
数据结构——迷宫问题
迷宫问题的总体思路是,从迷宫的入口出发,沿着某一个方向向前试探,若能够行得通,则继续往前走,否则原来返回,再换另一个方向继续试探,直到所有可能的通路都被试探过,为了保证在任何一个位置都能够原来返回,需要设置一个堆栈结构来保存从入口到当前位置的路径。原创 2016-06-20 17:47:05 · 973 阅读 · 0 评论