数据结构
coolwriter
这个作者很懒,什么都没留下…
展开
-
数据结构概念
基本概念1.数据结构起源计算机除了数值计算问题以外还需要解决现实生活中很多的问题,而这些问题涉及到现实中很多复杂的对象,不同对象之间具有复杂的关系,数据结构正是描述这些对象之间复杂关系的。但数据结构并非研究复杂算法的一门学科。2.数据结构基本概念数据: 程序中要操作的对象,用于描述客观事物。可被输入到计算机,也可被计算机处理。如: int a,转载 2017-11-28 20:29:02 · 447 阅读 · 0 评论 -
二叉树前序、中序、后序遍历非递归写法
前言在前两篇文章二叉树和二叉搜索树中已经涉及到了二叉树的三种遍历。递归写法,只要理解思想,几行代码。可是非递归写法却很不容易。这里特地总结下,透彻解析它们的非递归写法。其中,中序遍历的非递归写法最简单,后序遍历最难。我们的讨论基础是这样的: [cpp] view plain copy//Binary Tree Node转载 2017-12-21 10:37:43 · 270 阅读 · 0 评论 -
二叉搜索树
定义二叉搜索树(Binary Search Tree)或称二叉查找树,也称二叉排序树(Binary Sort Tree)。它或者是一棵空树,或者是具有下列性质的二叉树:若左子树不空,则左子树上所有节点的值均小于它的根节点的值;若右子树不空,则右子树上所有节点的值均大于它的根节点的值;左、右子树也分别为二叉搜索树;性质二叉搜索树与普通二叉树相比,有一些优秀的特征或性质转载 2017-12-21 10:40:40 · 245 阅读 · 0 评论 -
C++递归,汉诺塔
A为存放盘子的塔,B为目标塔,C为辅助塔 算法分为三步 一、将A上n-1个盘子全部放到C塔上 二、将A上剩下的一个盘子放到B塔上 三、将C塔上的盘子全部放到B塔上注:不需要考虑如何移动n-1个盘子递归过程: 首先,将A上n-1个盘子放到C上,然后将A上剩下的一个盘子放到B上,然后可以看成A为辅助塔,B为目标塔,C为放盘子的(B中有一个最大的盘子,但任何盘子都能放转载 2017-12-04 21:54:37 · 236 阅读 · 0 评论 -
中序线索化二叉树
/*线索化二叉树。 (1)中序线索化二叉树; (2)遍历线索化二叉树。 */ #include <iostream> #include <malloc.h> #define MaxSize 100 typedef char ElemType; using namespace std; typedef struct node { ElemType dat转载 2017-12-06 10:54:12 · 1228 阅读 · 0 评论 -
十种排序算法
1.常见算法分类十种常见排序算法一般分为以下几种: (1)非线性时间比较类排序:交换类排序(快速排序和冒泡排序)、插入类排序(简单插入排序和希尔排序)、选择类排序(简单选择排序和堆排序)、归并排序(二路归并排序和多路归并排序);(2)线性时间非比较类排序:计数排序、基数排序和桶排序。总结: (1)在比较类排序中,归并排序号称最快,其次是快速排序和堆排序,两者不相伯仲,但是有...转载 2017-12-06 17:10:51 · 64356 阅读 · 5 评论 -
两种冒泡排序的比较及冒泡算法优化
第一种:void bubbleSort(int array[],int len){ //循环的次数为数组长度减一,剩下的一个数不需要排序 for(int i=0;i1;++i){ bool noswap=true; //循环次数为待排序数第一位数冒泡至最高位的比较次数 for(int j=0;j1;++j){原创 2018-01-30 19:49:02 · 354 阅读 · 0 评论 -
快速排序,堆排序和基数排序
之前我的博客有排序算法总结 十种排序算法 - CSDN博客 https://blog.csdn.net/coolwriter/article/details/787327281、快速排序 快速排序的中心是填坑法,取一个数(这里选取第一个数)作为基准数temp,从队尾开始寻找第一个比基准数小的数a[j],交换a[j]和temp,然后队首开始查找第一个比temp大的数a[i],交换之,遍...转载 2018-05-01 16:44:16 · 1837 阅读 · 0 评论 -
哈希表(散列表)原理详解
一、什么是哈希表? 哈希表(Hash table,也叫散列表),是根据关键码值(Key value)而直接进行访问的数据结构。也就是说,它通过把关键码值映射到表中一个位置来访问记录,以加快查找的速度。这个映射函数叫做散列函数,存放记录的数组叫做散列表。记录的存储位置=f(关键字)这里的对应关系f称为散列函数,又称为哈希(Hash函数),采用散列技术将记录存储在一块连续的存储空间中,这块连续存储...转载 2018-05-20 17:49:24 · 1245 阅读 · 1 评论 -
哈希表和红黑树
什么是HashHash,也可以称为“散列”,就是把任意长度的输入,通过散列算法,变换成固定长度的输出,该输出就是散列值。这是一种压缩映射,也就是,散列值的空间通常远小于输入的空间,不同的输入可能会散列成相同的输出(也就是多对一的关系)。哈希表的构造在所有的线性数据结构中,数组的定位速度最快,因为它可通过数组下标直接定位到相应的数组空间,就不需要一个个查找。而哈希表就是利用数组这个能够快速定位数据的...转载 2018-05-25 10:07:31 · 542 阅读 · 0 评论 -
哈希表查找——成功和不成功时的平均查找长度
哈希表查找——成功和不成功时的平均查找长度 以下求解过程是按照“计算机统考的计算方法”,不同的老师、教材在“处理冲突”上可能会有不同的方法,所以最主要的是掌握原理即可,对于考研的朋友最好掌握统考真题的解题方法。题目例子:(2010年全国硕士研究生入学统一考试计算机科学与技术学科联考计算机学科专业基础综合试题第一题) 将关键字序列(7、8、30、11、18、9、14)散列存...转载 2018-08-12 10:27:22 · 47873 阅读 · 25 评论 -
#号法创建树
思路:利用前序遍历来建树(结点值陆续从键盘输入,用先序遍历的顺序为宜),后序遍历销毁一个树。#define _CRT_SECURE_NO_WARNINGS#include #include #include #include //二叉链表示法struct _bitTree{ int data; struct _bitTree * lchild, *rchi原创 2017-12-04 12:23:24 · 642 阅读 · 0 评论 -
顺序存储链表
头文件#pragma oncetemplate <typename T>class SeqList{public: SeqList(int capcity); ~SeqList(); int getLength(); int getCapacity(); int insert(T &t, int pos); in...转载 2017-12-04 11:27:16 · 419 阅读 · 0 评论 -
中序遍历的栈实现
中序遍历的几种情况分析1:什么时候访问根、什么时候访问左子树、什么访问右子树 当左子树为空或者左子树已经访问完毕以后,再访问根 访问完毕根以后,再访问右子树。123分析2:为什么是栈,而不是其他队列。 先走到的后访问、后走到的先访问,显然是栈结构12分析3:结点所有路径情况步骤1: 如果结点有左子树,该结点入栈; 如果结点没有左子转载 2017-12-04 11:03:20 · 3828 阅读 · 0 评论 -
线性表的顺序存储
线性表的顺序存储1.基本概念2.设计和实现2.1 插入元素算法判断线性表是否合法判断插入位置是否合法把最后一个元素到插入位置的元素后移一个位置将新元素插入线性表长度加12.2 获取元素操作判断线性表是否合法判断位置是否合法直接通过数组下标的方式获取元素2.3 删除元素算法判断线性表是否合法判断删除位置是否合法将元素取出转载 2017-11-28 20:31:45 · 237 阅读 · 0 评论 -
线性表的链式存储
线性表的链式存储1. 基本概念链式存储定义 为了表示每个数据元素与其直接后继元素之间的逻辑关系,每个元素除了存储本身的信息外,还需要存储指示其直接后继的信息。 表头结点 链表中的第一个结点,包含指向第一个数据元素的指针以及链表自身的一些信息数据结点 链表中代表数据元素的结点,包含指向下一个数据元素的指转载 2017-11-30 22:19:13 · 284 阅读 · 0 评论 -
循环链表
循环链表1.基本概念循环链表的定义: 将单链表中最后一个数据元素(业务节点)的next指针指向第一个元素 循环链表拥有单链表的所有操作创建链表 销毁链表 获取链表长度 清空链表 获取第pos个元素操作 插入元素到位置pos 删除位置pos处的元素新增功能:游标的定义 在循环链表中可以定义一个“当前转载 2017-11-30 22:56:09 · 475 阅读 · 0 评论 -
双向链表
双向链表1.基本概念单链表的尴尬单链表的结点都只有一个指向下一个结点的指针 单链表的数据元素无法直接访问其前驱元素 逆序访问单链表中的元素是极其耗时的操作!len = LinkList_Length(list);for (i=len-1; len>=0; i++) //O(n){LinkListNode *p = LinkList_Get(转载 2017-11-30 22:56:53 · 198 阅读 · 0 评论 -
二叉树的非递归遍历
二叉树的非递归遍历 二叉树是一种非常重要的数据结构,很多其它数据结构都是基于二叉树的基础演变而来的。对于二叉树,有前序、中序以及后序三种遍历方法。因为树的定义本身就是递归定义,因此采用递归的方法去实现树的三种遍历不仅容易理解而且代码很简洁。而对于树的遍历若采用非递归的方法,就要采用栈去模拟实现。在三种遍历中,前序和中序遍历的非递归算法都很容易实现,非递归后序遍历实现起来相对转载 2017-12-10 10:41:30 · 195 阅读 · 0 评论 -
数据结构综述
参考文献:《大话数据结构》作者:程杰 写在最开始:这是我自己学习的经验和记录,有的内容很容易理解,但又比较重要,我会直接摘抄书上的内容;有些比较复杂,我会写明自己的思考;有些我自己也没搞懂,我会用红色文字标明,写出自己的疑问,也许以后会解决。 数据结构的概念:是一门研究非数值计算的程序设计问题中的操作对象,以及它们之间的关系和操作等相关问题的学科。转载 2017-12-02 12:50:41 · 2034 阅读 · 0 评论 -
树的遍历
#include #include #include //二叉链表示法struct _bitTree{ int data; struct _bitTree * lchild, *rchild;};typedef struct _bitTree BiTNode;typedef struct _bitTree* BiTreee;/*先序遍历*/void pr转载 2017-12-02 13:44:56 · 211 阅读 · 0 评论 -
求树的叶子个数
void countLeaf(BiTNode * T,int *_sum){ if (T != NULL) { if (T->lchild == NULL && T->rchild == NULL) { (*_sum)++; } if (T->lchild) {转载 2017-12-04 10:50:09 · 2252 阅读 · 0 评论 -
求树的高度
1.进行合法性判断,也是递归结束的条件 2.递归求出左子树的高度 3.递归求出右子树的高度 4.比较左右两边高度大小,选择大的那个加上“根”节点,这里的根是相对于每一个子树/节点的。 5.返回最后的高度int Depth(BiTNode * T){ int ret = 0; int dep_left = 0, dep_right = 0; if (T转载 2017-12-04 10:53:35 · 1497 阅读 · 0 评论 -
树的拷贝
1.合法性检测,同时也是递归拷贝结束的条件 2.递归拷贝左子树,返回新的左子树的指针 3.递归拷贝右子树,返回新的右子树的指针 4.给新的根节点分配内存 5.将上述得到的新左右子树指针初始化新的根节点 6.将形参根节点的数据复制到新根节点的数据域;BiTNode * CopyTree(BiTNode * T){ BiTNode * newRoot = NULL;转载 2017-12-04 11:00:38 · 1128 阅读 · 0 评论 -
并查集(模板&典型例题整理)
并查集,并查集是一种树形结构,又叫“不相交集合”,保持了一组不相交的动态集合,每个集合通过一个代表来识别,代表即集合中的某个成员,通常选择根做这个代表。 也就是说,并查集是用来处理不相交集合类型问题,如问不相交集合有几个。给定节点,找到该节点所在集合元素个数,当然这只是水题。并查集会与其他算法结合着考,如LCA中的tarjian算法。后续博客会整理。 并查集,顾名思义,主要分三部分。 一...转载 2019-02-23 16:40:27 · 5272 阅读 · 1 评论