数据结构
傅华涛Fu
热爱代码,热爱技术。
展开
-
堆和栈的简单区别
stack栈:栈是系统自动分配的,速度较快,但是程序员无法控制。栈中存放的是局部变量。栈会自动释放内存。栈的特点是先进后出。heap堆:堆需要程序员自己申请,通过new或malloc去申请,通常速度较慢,且容易产生内存碎片。堆中存放的是实例对象。堆需要程序员释放内存。...原创 2021-08-25 14:46:02 · 79 阅读 · 0 评论 -
树与二叉树——几种常见的平衡二叉树的构造过程
第一种:第二种:第三种:第四种:第四类:平衡二叉树的构造实例https://blog.csdn.net/fu_jian_ping/article/details/89292813平衡二叉树的四种基本调整类型https://blog.csdn.net/fu_jian_ping/article/details/88838524...原创 2019-04-14 09:50:43 · 1345 阅读 · 1 评论 -
树与二叉树——B树
B树的概念:适用于外查找的树,它是一种平衡的多叉树,称为B树(或B-树、B_树)。一棵m阶B树(balanced tree of order m)是一棵平衡的m路搜索树。m阶B树的定义如下:它或者是空树,或者是满足下列性质的树:1、根结点至少有两个子女;2、每个非根节点所包含的关键字个数 j 满足:ceil(m/2) - 1 <= j <= m - 1;...原创 2019-04-14 16:53:11 · 1489 阅读 · 0 评论 -
树与二叉树——平衡二叉树的实际问题求解
题目:若一棵平衡二叉树的高度为6,且所有非叶子结点的平衡因子都是1,则这棵二叉树有多少个结点?分析:首先需要知道什么是平衡二叉树,什么是平衡因子,以及二叉树的一些性质等等这些基础知识。平衡因子 = 左右子树的高度之差。对于这种题目,可以试着把这棵树画出来,树的形状不唯一。对于根节点而言,因为高度为6,假设左子树高度为5,则右子树高度为4,先把左子树画出来,这样就可以顺...原创 2019-04-14 19:24:45 · 1669 阅读 · 0 评论 -
图——邻接矩阵和邻接表存储的图的遍历的时间复杂度
用邻接矩阵构造图时,若存储的是一个无向图,则时间复杂度为O(n^2 + n*e),其中,对邻接矩阵的初始化耗费的时间为O(n^2);对于DFS,BFS遍历来说,时间复杂度和存储结构有关:n表示有n个顶点,e表示有e条边。1.若采用邻接矩阵存储,时间复杂度为O(n^2);2.若采用邻接链表存储,建立邻接表或逆邻接表时,若输入的顶点信息即为顶点的编号,则时间复...原创 2019-04-14 19:40:38 · 34049 阅读 · 5 评论 -
树与二叉树——二叉排序树
1.二叉排序树的定义二叉排序树:1)或者是一棵空树。2)或者是具有下列性质的二叉树: [1]若它的左子树不空,则左子树上所有的结点的值都小于它的根节点的值; [2]若它的右子树不空,则右子树上所有的结点的值都大于它的根节点的值; [3]它的左子树、右子树也都分别是二叉排序树。2.二叉排序树的查找二叉排序树又称为二叉查找树。查找过程和次优二叉树查找类似。即...原创 2019-04-15 09:19:15 · 2372 阅读 · 0 评论 -
排序算法——折半插入排序
折半插入排序基本思想:折半插入即充分利用前面有序的特点,进行排序。先进行折半查找,找到合适位置后,再进行将待排元素插入该位置。案例:代码:void BinaryInsertSort(Sqlist *L){ int i, j, low, high, mid; for (i = 2; i <= L->length; i++) { ...原创 2019-04-03 20:39:37 · 315 阅读 · 0 评论 -
排序算法——直接插入排序
插入排序的主要思想:每次将一个待排序的记录按其关键字大小插入到已经排好序的序列中,直到全部记录都排好序。直接插入排序算法思想:插入排序类似于玩纸牌时整理手中的纸牌的过程,,其基本思想是:依次将待排序序列中的每一记录插入到已经排好序的序列中,直到全部记录都排好序。案例演示:初始待排序列:12,15,9,20,6,31,24将第一个记录记为初始化的已经排好序的序列代...原创 2019-04-03 19:52:12 · 694 阅读 · 0 评论 -
排序——归并排序(顺序存储)
基本思想:将序列每相邻两个数字进行归并操作(merge),形成floor(n/2+n%2)个序列,排序后每个序列包含两个元素将上述序列再次归并,形成floor(n/4)个序列,每个序列包含四个元素重复步骤2,直到所有元素排序完毕案例:代码:#include<stdio.h>void Merge(int r[],int r1[],int s,int m,i...原创 2019-04-09 20:13:05 · 730 阅读 · 0 评论 -
排序——冒泡(起泡)排序
冒泡排序的基本思想: 比较相邻的元素。如果第一个比第二个大,就交换他们两个。 对每一对相邻元素做同样的工作,从开始第一对到结尾的最后一对。在这一点,最后的元素应该会是最大的数。 针对所有的元素重复以上的步骤,除了最后一个。 持续每次对越来越少的元素重复上面的步骤,直到没有任何一对数字需要比较。 案例:代码:最普通的冒泡排序算法:#inclu...原创 2019-04-09 20:57:25 · 2114 阅读 · 0 评论 -
排序——快速排序(顺序表存储)
案例:一趟快速排序的过程:代码:#include <stdio.h> void Qsort(int arr[], int low, int high){ if (high <= low) return; int i = low; int j = high + 1; int key = arr[low]; w...原创 2019-04-09 14:18:26 · 1341 阅读 · 0 评论 -
树与二叉树——根据前序和后序判断中序遍历顺序
先列举两个推论:根据前序和中序遍历顺序可以唯一确定一棵二叉树;根据中序和后序遍历顺序可以唯一确定一棵二叉树;题目:若一棵二叉树的前序遍历和后序遍历分别为1,2,3,4和4,3,2,1,则该二叉树的中序遍历不会是:A、1,2,3,4B、2,3,4,1C、3,2,4,1D、4,3,2,1因为根据前序和后序无法确定一棵二叉树,又由于这里是选择题,则可以结合题目进...原创 2019-03-28 23:02:45 · 2622 阅读 · 0 评论 -
计算机科学中的树
计算机科学中的树二叉树 ▪二叉树 ▪二叉查找树 ▪笛卡尔树 ▪Top tree ▪T树 自平衡二叉查找树 ▪AA树 ▪...原创 2019-04-14 15:34:33 · 459 阅读 · 0 评论 -
树与二叉树——有关n叉树的若干问题
经验总结:1.对于求解带权路径长度最值的问题可以联想到哈弗曼树。2.不管是几叉树,都可以联想到二叉树,很多性质都可以从二叉树中推广得到。假定虚位表示权值为0的结点。有以下推论:m表示节点个数,n表示n叉树,若k =(m-1)%(n-1) = 0,说明不需要虚位,否则需要(n-1)-(m-1)%(n-1)个虚位。题目:已知三叉树T 中 6 个叶结点的权分别...原创 2019-04-14 13:41:26 · 1214 阅读 · 0 评论 -
树与二叉树——有关计算的题目
一、题目:在度为4的树中,若有20个度为4的节点,10个度为3的节点,1个度为2的节点,10个度为1的节点,则树T的叶节点个数是?这道题是2010年计算机联考真题。我用手算(半蛮力)解出答案是82,结果是对的,但是耗时较长,而且如果数字再大点也不好算了,因此肯定存在一种更加高效的方法。我们知道,树的节点的个数=树的度+1于是树的节点个数N = 1 + 20*4 + 10*3 + 1...原创 2019-05-05 15:25:32 · 2223 阅读 · 0 评论 -
排序小结
排序的问题比较杂,想通过这篇博客理顺一下,基础的概念这里不累述。总体的知识框架如下: 1、关于适用场景:①直接插入排序适用于排序表和数据量不大的排序表;②取一大堆数据中K个最大(小)的元素,优先选用堆排序;③大规模排序,希尔排序均能达到较好的效果;④快速排序的平均性能达到O(nlog2...转载 2019-05-05 14:48:35 · 168 阅读 · 0 评论 -
广义表的深度和长度
广义表记做:LS = (a1, a2, a3, a4......an)。其中,LS是广义表的表名,n是广义表的长度。广义表中嵌套的括号的层数为其深度。案例:广义表 L = ((a, b, c), e)分析:根据广义表的定义可知,a1=(a, b, c), a2=3所以其长度为2。广义表的括号嵌套层数为2,所以其深度为2。...原创 2019-04-13 13:54:31 · 16513 阅读 · 1 评论 -
已知哈夫曼树总顶点数求叶子结点数
题目:已知一棵哈夫曼树有13个顶点,求其叶子结点的个数。分析:首先,哈夫曼树是一个二叉树;第二点,哈弗曼树的度只有两种情况,一是只有两个度的结点,二是没有度的结点,即叶子结点。明确这两点之后,做该题就非常简单了。解题:设分支结点个数为a, 叶子结点个数为b,则有以下连个关系式:a + b = 132*a + 1 = 13根据以上两个式子可以求得: b =...原创 2019-04-13 14:16:20 · 24261 阅读 · 2 评论 -
卡特兰数
卡特兰数又称卡塔兰数,英文名Catalan number,是组合数学中一个常出现在各种计数问题中出现的数列。卡特兰数Cn满足以下递推关系[1]:应用:1.括号化矩阵连乘: P=a1×a2×a3×……×an,依据乘法结合律,不改变其顺序,只用括号表示成对的乘积,试问有几种括号化的方案?(h(n)种)[4]2.出栈次序一个栈(无穷大)的进栈序列为1...原创 2019-04-13 17:20:08 · 851 阅读 · 0 评论 -
哈弗曼树的路径问题
题目:2015年考研数据结构第三题下列选项给出的从根分别到两个叶子结点路径上的权值序列,能属于同一棵哈夫曼树的是:()A.24,10,5 和24,10,7B. 24,10,5和24,12,7C. 24,10,10和24,14,11D. 24,10,5和24,14,6首先明确两个要点:1、哈弗曼树的结点的度只有2和0两种情况,即要么有两个孩子,要么没有孩子,不可能...原创 2019-04-13 18:35:52 · 2382 阅读 · 0 评论 -
树与二叉树——二叉树中计算叶子结点个数问题
1、已知完全二叉树具有967个结点,则其叶子结点个数为:详解:首先明确一点该二叉树是一棵二叉树,那可以使用二叉树的一些性质。从第一层开始计算每层的节点个数:1,2,4,8,16,32,64,128,256,512,1024...将前9层的结点数量全部加起来有511个,如果加上第十层1024,则超过967,所以该完全二叉树肯定是有十层的,所以叶子结点分布在第9层和第10层,且第10层...原创 2019-04-13 18:57:42 · 13977 阅读 · 2 评论 -
关于排序算法中关键字初始排列顺序问题
与数组初始状态无关的内排序算法首先,与初始状态无关分为几种情况1、算法复杂度与初始状态无关;2、元素总比较次数与初始状态无关;3、元素总移动次数与初始状态无关。【其实还有一种就是总排序趟数与初始状态无关,由于分析简单,除了快速排序的排序次数(递归深度)与关键字选择(初始状态)有关,还有一个优化后的冒泡排序和后序是否有序有关,其他均只与总长度n有关,与初始状态无关,故不做分...转载 2019-04-13 19:00:31 · 3609 阅读 · 3 评论 -
树与二叉树——平衡二叉树的构造问题及其实际问题
题目:若将关键字1,2,3,4,5,6,7 依次插入到初始为空的平衡二叉树 T 中,则 T 中平衡因子为 0 的分支结点的个数是( )。从图中可以知道,平衡因子为0的结点有:4,2,6 共三个。这个题目其实考的就是如何根据关键字构造平衡二叉树,只要把平衡二叉树正确地画出来了,就能够很清楚地知道各个平衡因子的结点个数。...原创 2019-04-13 20:03:15 · 5843 阅读 · 1 评论 -
图——关键路径缩短整个工程进度的问题
关键路径的有关概念:https://blog.csdn.net/fu_jian_ping/article/details/88962697题目:下列AOE网表示一项包含8个活动的工程。通过同时加快若干活动的进度可以缩短整个工程的工期。下列选项中,加快其进度就可以缩短工程工期的是()A.c和eB.d和eC.f和dD.f和h该图的关键路径有:bfhbdfhbd......原创 2019-04-13 20:20:20 · 10745 阅读 · 4 评论 -
平衡二叉树的构造过程实例
平衡二叉树实现的实例选取一组数据分别为2,1,0,3,4,5,6,9,8,7的10个结点来构造平衡二叉树。首先数据为2的结点作为根结点插入,接着插入1,仍是平衡的,再插入0是,2的平衡因子变为2,此时出现了不平衡,因此需要进行调整,最低不平衡结点为2,属于LL型,调整过程如图1所示。接着插入3,是平衡的,再插入4,此时出现了不平衡,结点 1 和 2的平衡因子都为 -2,结点2为最低...原创 2019-04-14 09:13:08 · 36266 阅读 · 6 评论 -
树与二叉树——前序、中序非递归遍历算法
二叉树的链式存储结构:typedef struct BTNode { ElemType data; struct BTNode *lchild, *rchild;} BTNode;前序非递归遍历算法:设T是指向二叉树根结点的指针变量,非递归算法:若二叉树为空,则返回;否则,令p = T;(1)访问p所指向的结点;(2)若p不为空,p进栈,p = p-&...原创 2019-03-28 22:47:11 · 1122 阅读 · 0 评论 -
图——关键路径
AOE网示例图:AOE网:在一个表示工程的带权有向图中,用顶点表示事件(如V0),用有向边表示活动(如<v0,v1> = a1),边上的权值表示活动的持续时间,称这样的有向图为边表示的活动的网,简称AOE网(activity on edge network)源点:在AOE网中,没有入边的顶点称为源点;如顶点V0终点:在AOE网中,没有出边的顶点称为终点;如...原创 2019-04-02 09:10:27 · 69421 阅读 · 23 评论 -
图——图的有关概念
1.无向图2.有向图3.完全无向图在完全无向图中,设顶点的个数为n, 则边的条数为 n(n-1) / 2.即n个顶点都与其他n-1个顶点之间有一条边,所以有n(n-1),而每两个顶点之间的边是一样的,所以要除以2,所以最后的边的条数为n(n-1) / 2.4.完全有向图5.子图和生成子图原图:子图:从原图中任意删除其中的顶点及与顶点有关的边,...原创 2019-03-27 16:54:38 · 252 阅读 · 0 评论 -
树与二叉树——哈夫曼树及哈夫曼编码
哈弗曼树的有关概念和定义这里省略,这里主要是展示如何用代码构造哈夫曼树以及哈夫曼编码。#include <stdio.h> #define SIZE 5 /*假设字符集中有5个字符*/typedef struct /*定义哈夫曼树的结点结构*/{ in...原创 2019-03-27 15:26:36 · 523 阅读 · 0 评论 -
树与二叉树——前序、中序、后序递归遍历,层序遍历
二叉树的结构定义:#define MAXSIZE 100typedef char dataType;struct TreeNode{ dataType data; TreeNode *left, *right;};创建二叉树://输入示例:AB##C##//创建二叉树//以先序序列输入各节点的数据,某节点的左子树或右子树为空时,输入一个特殊的值 xvo...原创 2019-03-27 15:17:07 · 206 阅读 · 0 评论 -
图——存储结构为邻接表表示的图的深度优先搜索递归算法详解
深度优先搜索的算法思想: 设初始状态时图中的所有顶点都未被访问,则: (1):从图中某个顶点i出发,访问i; 然后找到i的一个邻接顶点i1; (2):从i1出发,深度优先搜索访问和i1相邻接且未被访问的所有顶点; (3):转(1),直到和i相邻接的所有顶点都被访问为止; (4):继续选取图中未被访问顶点j作为其实顶点,转(1),直到图中所有顶点都...原创 2019-03-31 20:32:16 · 3169 阅读 · 0 评论 -
树与二叉树——线索二叉树
线索二叉树:若结点有左子树,则其lchild域指向其左子树,否则令lchild域指向其前驱;若结点有右子树,则其rchild域指向其右子树,否则令rchild域指向其后继;为了避免混淆,需要改变结点结构,增加两个标志域,LTag, RTag,结构如下图所示: LTag :0: lchild域指向其左子树1: lchild域指向其前驱R...原创 2019-03-27 13:51:48 · 909 阅读 · 0 评论 -
树与二叉树——递归算法、非递归算法求二叉树的深度
二叉树的结构:typedef struct BTNode { ElemType data; struct BTNode *lchild, *rchild;} BTNode;递归算法求二叉树的深度depth:这个递归算法求二叉树的深度其实和遍历二叉树的后序遍历算法差不多。int BTNodeDepth(BTNode *b){ int lchildD...原创 2019-03-31 16:40:32 · 3000 阅读 · 4 评论 -
树与二叉树——平衡二叉排序树的四种调整类型
关于平衡二叉树、二叉排序树、平衡二叉排序树的概念这里就不一一详细介绍了,这里主要是简单介绍一个如何将一个非平衡二叉排序树调整为平衡二叉排序树。平衡二叉排序树的调整主要有以下四种类型:LL型——即左左型:这三个结点的值得大小依次为:A > B > C RR型——即右右型:这三个结点的值得大小依次为:A > B > CLR型—...原创 2019-03-27 11:05:19 · 1840 阅读 · 0 评论 -
树与二叉树——查找结点的递归算法和非递归算法
问题:设f(b, x)在二叉树b中查找值为x的结点(唯一),找到后返回其指针,否则返回NULL。二叉树的结构:typedef struct BTNode { ElemType data; struct BTNode *lchild, *rchild;} BTNode;递归算法:BTNode *FindNode(BTNode *b, ElemType x)...原创 2019-03-30 23:08:16 · 3016 阅读 · 5 评论 -
无表头结点单链表的基本操作
已知L是无表头结点的单链表,且P既不是首元结点,也不是尾元结点:1.在P结点后插入S结点思路:在P结点之后插入结点S,只需要更改P和S结点的指针即可,即原先的P结点的直接后继作为S结点的直接后继,然后S结点变为P结点的直接后继,这两步操作的顺序不可改变[1]:S->next = P->next;[2]:P->next = S;2.在P结点前插入S结点...原创 2019-03-23 09:32:22 · 6329 阅读 · 0 评论 -
递增有序顺序表插入元素的算法
题目:设顺序表va中的数据元素递增有序,现将x插入到顺序表的适当位置,以保持该顺序表依然递增有序。算法思想:1.判断该顺序表是否已满2.查找x在顺序表a.elem[a.length]中的插入位置 i。3.在查找到x的位置之后,将a.length-i-1个元素向后移动一个位置,从最后一个元素开始向后移动一个位置。4.将元素x插入到位置i中。算法:Statue ...原创 2019-03-23 11:10:28 · 17007 阅读 · 2 评论 -
双向链表的基本操作
已知P结点是某双向链表的中间结点:1.在P结点后插入S结点S->next = P->next;P->next->prior = S;S->prior = P;P->next = S;2.在P结点前插入S结点S->prior = P->prior;P->prior->next = S;S-&...原创 2019-03-23 10:51:09 · 1532 阅读 · 2 评论 -
图——存储结构为邻接表表示的图的广度优先搜索递归算法详解
图的广度优先搜索算法思想:设初始状态时图中的所有顶点都未被访问,则:(1):从图中某个顶点i出发,访问i;(2):访问i的所有相邻接且未被访问的所有顶点i1, i2, i3...in;(3):以i1, i2, i3...in的次序,以ij (1<=j<=n)一次作为i, 转(1);(4):继续选取图中未被访问顶点k作为起始顶点,转...原创 2019-03-31 22:38:16 · 975 阅读 · 0 评论 -
图——最小生成树之Prime算法
案例分析:第一步:第二步:第三步:第四步:原创 2019-03-31 23:26:17 · 830 阅读 · 0 评论