
数据结构
qingcunsuiyue
集美貌、智慧、才华于一身的女子。
展开
-
【二叉树前序遍历】Python实现二叉树前序遍历
#-*- coding: utf-8"""date:5-14function: 用非递归的方式前序遍历二叉树(中左右)用对了(先入先出的一种线性表数据结构)来实现前序遍历"""class Node(object): def __init__(self, root='', left='', right=''): """构造函数""" self.root = root self.left = left self.right .原创 2020-05-16 15:31:41 · 377 阅读 · 0 评论 -
B树(平衡多路查找树)
1. B树是一种平衡的多路查找树,其中每一个节点的孩子数可以多于2个,且每一个节点可以存储多个元素。2. 节点最大的孩子数目称为B树的阶。一个M阶的B树具有以下属性: . 如果根节点不是叶子节点,则至少有2棵子树。 . 每一个非根非叶子节点有M/2到M个孩子节点。 . 每一个非根节点有M/2-1到M-1个关键字,并且以升序排列。 . 所有的叶原创 2016-11-13 20:55:42 · 2837 阅读 · 0 评论 -
RBTree----红黑树
1.概念: 红黑树是一颗二叉搜索树,它在每一个节点上增加了一个存储位来表示节点的颜色(红/黑)。红黑树保证最长路径不超过最短路径的2倍,因而近似于平衡。2.性质: (1)每一个节点,不是红色就是黑色。 (2)根节点是黑色的。 (3)不能有连续的红节点。 (4)对于每个节点,从该节点到其所有后代叶子节点的路原创 2016-11-02 18:04:36 · 290 阅读 · 0 评论 -
七大排序
排序的分类:ps:我在这里实现的排序算法,都是用数组来实现的。1.插入排序基本思想:将一个数插入到已排好序的数组中,从而得到一个新的,个数加1的数组。ps:index为要插入的数的下标,pos为已排好序的数组的最后一个数的下标。时间复杂度为:O(n^2)void InsertSort(int* a,size_t n) //按升序{ for(size_t ind原创 2016-11-24 00:12:54 · 444 阅读 · 0 评论 -
小米面试题------朋友圈问题
题目描述:假如已知有n个人和m对好友关系(存于数字r),如果两人是直接或间接好友(好友的好友的好友....),则认为他们属于同一个朋友圈,请写程序求出这n个人里一共有多少个朋友圈。例如:n=5,m=3,r={{1,2},{2,3},{4,5}},表示有5个人,1和2是好友,2和3是好友,4和5是好友,则1,2,3,属于一个朋友圈,4,5属于另一个朋友圈。结果为2个朋友圈。解题思路:原创 2016-11-27 21:48:04 · 1095 阅读 · 0 评论 -
排序(二)非比较排序
七大排序那篇博客讲的排序都是比较排序,这篇博客要写的内容是不需要通过比较就可以排序。1.计数排序2.基数排序原创 2017-01-02 22:48:45 · 450 阅读 · 0 评论 -
二叉树的相关面试题 <三>---------二叉树的镜像
题目:输入一个二叉树,输出它的镜像。解题思路:求树的镜像就是遍历树的同时交换非叶子节点的左右节点。前序遍历,当当前节点的左右子树节点不为空时,交换左右节点。原图为:镜像和原图对比图为:原创 2017-01-03 23:34:57 · 564 阅读 · 0 评论 -
二叉树相关的面试题<一>
1.判断B是否为A的子结构2.判断一颗二叉树是否为完全二叉树原创 2016-12-24 21:03:00 · 351 阅读 · 0 评论 -
二叉树的相关面试题<二>
1.求二叉树中最远的两个节点的2.求两个节点最近的公共祖先原创 2016-12-29 20:29:23 · 282 阅读 · 0 评论 -
二叉树的相关面试题<三>-----二叉树中和为某一的路径
题目:输入一颗二叉树和一个整数,打印出二叉树中节点值的和为输入整数的所有路劲。void PrintNodeEqualInt() { int num; cout<<"输入一个整数:"<<endl; cin>>num; int sum=0; queue q; _PrintNodeEqualInt(_root,num,sum,q); }void _PrintNodeE原创 2016-12-31 21:33:11 · 694 阅读 · 0 评论 -
空间配置器
空间配置器:为了解决因频繁小块开辟时,产生的内存碎片问题。如果开辟的内存大于128个字节时,就调用一级空间配置器,小于128个字节时,就调用二级空间配置器。一级空间配器:封装了malloc()和free()。注意:如果客户端设置的内存不足处理函数,没有设置好,会存在死循环的危险。//一级空间配置器template class __Malloc_Alloc_Templat原创 2017-04-13 22:55:52 · 287 阅读 · 0 评论 -
内存池
#pragma once#includetemplateclass ObjectPool{protected: struct Node { void* _memory;// 内存块 Node* _next; //指向下一块节点的指针 size_t _objectNum;//统计内存对象的个数 Node(size_t objectNum) :_objectNum(原创 2017-04-14 18:27:04 · 193 阅读 · 0 评论 -
最长公共子串(动态规划的思想)
//最长公共子串void Lsc(){ string s1="abcde"; string s2="bebcd"; int max=0; int end=0; int row=0; int col=s2.size()-1; int length=s1.size(); while(row < length) { //开始向右下方遍历 int i=row; int j原创 2017-09-10 22:28:53 · 395 阅读 · 0 评论 -
稀疏矩阵(实现快速转置和普通转置)
1.M*N的矩阵,矩阵中有效值的个数远小于无效值的个数,且这些数据的分布没有规律。2.稀疏矩阵的压缩存储:压缩存储值存储极少数的有效数据。使用{row,col,value}三元组存储每一个有效数据,三元组按原矩阵中的位置,以行优先级先后顺序依次存放。 3.矩阵的转置:将原矩阵的行、列对换,也就是将[i][j]和[j][i]位置上的数据对换。(转置有快速转置和普通转置)原创 2016-10-20 17:02:21 · 1532 阅读 · 0 评论 -
对称矩阵及对称矩阵的压缩存储
1.对称矩阵:设一个N*N的方阵A,A中任意元素Aij,当且仅当Aij == Aji(0 2.压缩存储称矩阵存储时只需要存储上三角/下三角的数据,所以最多存储n(n+1)/2个数据(根据等差数列的前n项和可求得)。3.对称矩阵和压缩存储的对应关系:下三角存储i>=j, SymmetricMatrix[i][j] == Array[i*(i+1)/2+j]。4.这就是一个对称矩阵原创 2016-10-20 16:48:57 · 1150 阅读 · 0 评论 -
走迷宫问题
1.这个是迷宫,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 1 1 1 0 1 11 1 0 1 1 1原创 2016-10-10 22:35:06 · 461 阅读 · 0 评论 -
用迭代器实现list的各种功能
#include#include#include#includeusing namespace std;templatestruct _ListNode{ _ListNode* _prev; _ListNode* _next; T _data; _ListNode(const T& x) :_data(x) ,_prev(0) ,_next(0) {}};原创 2016-10-11 15:46:58 · 1235 阅读 · 0 评论 -
栈和队列面试题
1.实现一个栈,要求实现Push(入栈),Pop(出栈),Min(返回最小值得操作)的时间复杂度为 O(1)思路:用已有的栈来完成时间复杂度为O(1)的栈datastack 数据栈 push 2 3 1 4 pop 2 3 pop 2 minstack 辅助栈 2 2 1 1 2 2 2templateclass原创 2016-10-11 16:16:24 · 418 阅读 · 0 评论 -
二叉搜索树(递归和非递归分别实现)
这是在上一篇博客的基础上进行完善。1.插入的递归bool InsertR(const T& key) { return _InsertR(_root,key); }bool _InsertR(Node*& root,const T& key) { if(root==NULL) { root=new Node(key); return true; }原创 2016-10-21 23:28:22 · 394 阅读 · 0 评论 -
堆---heap
堆的数据结构是一种数组对象,它可以视为一颗完全二叉树结构。堆结构的二叉树存储是:最大堆:每个父节点都大于孩子节点。最小堆:每个父节点都小于孩子节点。#includeusing namespace std;#include#include#include//仿函数==>函数对象templatestruct GreatBig{ bool operator()(con原创 2016-10-12 18:58:35 · 235 阅读 · 0 评论 -
递归和非递归遍历二叉树
#includeusing namespace std;#include#include#includetemplatestruct BinaryTreeNode{ BinaryTreeNode(const T& data) :_data(data) ,_left(NULL) ,_right(NULL) {} BinaryTreeNode* _left; Bina原创 2016-10-12 19:13:14 · 219 阅读 · 0 评论 -
中序、前序、后序遍历线索化二叉树
1.二叉树是一种非线性结构,遍历二叉树几乎都是通过递归或用栈辅助实现非递归的遍历,用二叉树作为存储结构时,取到一个节点,只能获取节点的左孩子和右孩子,不能直接得到节点的任一遍历序列的前驱和后继。2.为了保存这种在遍历中需要的信息,我们利用二叉树中指向左右子树的空指针来存放节点的前驱和后继信息。 创建节点:enum PointerTag{ THREAD, LINK,};te原创 2016-10-14 20:34:31 · 1245 阅读 · 0 评论 -
AVLTree----平衡二叉搜索树
1.定义:AVL树又称为高度平衡的二叉搜索树,它能保持二叉树的高度平衡,尽量降低二叉树的高度,减少树的平均搜索长度。2.AVL树的性质(1). 左子树和右子树的高度之差的绝对值不超过1。(2). 树中的每个左子树和右子树都是AVL树。(3).每个节点都有一个平衡因子(balance factor--bf),任一节点的平衡因子是-1,0,1。(每个节点的平衡因子等于右子树的高度减去左原创 2016-10-25 21:28:41 · 385 阅读 · 0 评论 -
堆排序
堆排序是在堆的基础上排序呢,如果要升序排序就要建大堆,如果要降序排序就要建小堆,时间复杂度为O(N*lgN)。#includeusing namespace std;#include#include//#include"Heap.h"//仿函数==>函数对象templatestruct Up{ bool operator()(const T& m,const T& n)原创 2016-10-16 22:42:36 · 278 阅读 · 0 评论 -
哈夫曼树
Huffman树,又称为最优二叉树,是加权路径长度最短的二叉树。【贪心算法】是指在问题求解时,总是做出当前看起来最好的选择。也就是说贪心算法做出的不是整体最优的的选择,而是某种意义上的局部最优解。贪心算法不是对所有的问题都能得到整体最优解。使用贪心算法构建Huffman树templatestruct HuffmanTreeNode{ T _weight; HuffmanTree原创 2016-10-18 19:09:08 · 375 阅读 · 0 评论 -
二叉搜索树
二叉搜索树的性质:1. 每个节点都有一个作为搜索依据的关键码(key),所有节点的关键码互不相同。2. 左子树上所有节点的关键码(key)都小于根节点的关键码(key)。3. 右子树上所有节点的关键码(key)都大于根节点的关键码(key)。4. 左右子树都是二叉搜索树。5.中序遍历的结果是有序的。我在这里分析一下删除一个节点的思路:(1).当删5这个节点时,直原创 2016-10-18 18:56:16 · 248 阅读 · 0 评论 -
哈希表(散列表)的实现
1.概念:是根据关键字(key)而直接访问在内存存储位置的数据结构。它通过一个关键值的函数将所需的数据映射到表中的位置来访问数据,这个映射函数叫做散列函数,存放记录的数组叫做散列表。2.散列函数的构造方法 (1).直接定址法--取关键字的某个线性函数为散列地址,Hash(Key)= Key 或 Hash(Key)= A*Key + B,A、B为常数。优点:简单、均匀,也原创 2016-11-09 21:54:53 · 517 阅读 · 0 评论 -
链表面试题(一)
这篇文章是在上一篇的基础上完成的1.删除无头链表的非尾结点。 解题思路:因为不知道pos的前一个结点,所以只能删除pos的后一个结点。 首先,把pos下一个结点的data赋值给pos的data,然后把pos和pos的下下一个结点连接,最后删除pos的下一个结点。刚开始的链表如下图所示: 经分析后得到的图如下: 代码如下:原创 2016-06-20 20:53:24 · 286 阅读 · 0 评论