【数据结构】
文章平均质量分 55
Bruce-XIAO
这个作者很懒,什么都没留下…
展开
-
图最短路径算法
图最短路径算法原创 2023-04-06 22:34:58 · 427 阅读 · 1 评论 -
最小堆求topk个数
最大堆求topk个数最大堆性质:root->data < root->left->data && root->right->data建堆->调整->排序->取前k个数调整:从第len/2-1个节点开始,倒数第一个非叶子结点,依次从右往左,从底至上调整堆,满足最大堆性质[4,5,1,6,2,7,3,8]#include<vector>#include<iostream>using namespace原创 2021-03-18 19:38:36 · 542 阅读 · 0 评论 -
最小生成树Prim和Kruskal的java实现
最小生成树概述最小生成树是从无向带权图中找出 n-1条边,将以最小的代价将图上的n个顶点连接起来,有两种最小生成树算法,一种是Prim算法,选结点;另一种是Kruskal, 选边Java实现```javaimport java.util.ArrayList;import java.util.Collections;import java.util.Comparator;class Edge{ int start; int end; int weight; pu原创 2021-08-08 22:34:02 · 375 阅读 · 0 评论 -
图的广度优先遍历
基本思想 1、从图中某个顶点V0出发,并访问此顶点; 2、从V0出发,访问V0的各个未曾访问的邻接点W1,W2,…,Wk;然后,依次从W1,W2,…,Wk出发访问各自未被访问的邻接点; 3、重复步骤2,直到全部顶点都被访问为止。类似于树的按层次遍历,也就是一层一层地遍历,图的广度优先遍历从图中的某个结点出发,访问它的邻结点再访问邻结点的邻结点,由近及远。如上图:从A出发,依次访问A结点的邻接点原创 2016-12-20 18:28:28 · 1037 阅读 · 0 评论 -
快速排序里的学问:随机化快排
#include "stdio.h"#include "math.h"#include "stdlib.h"#include "time.h" int num = 10;void swap(int *a,int *b){ int tmp; tmp = *a; *a = *b; *b = tmp;}void Pr转载 2016-05-22 10:56:05 · 495 阅读 · 0 评论 -
串
串的基本概念串(string)(或字符串)是由零个或多个字符组成的有限序列,一般记为:s='a1a2...an'(n>=0)串的基本操作串的逻辑结构与线性表极为相似,区别仅在于串的数据对象约束为字符集 。然而串的操作与线性表有很大的差别。在线性表基本操作中,大多以单个元素作为操作对象;而在串的基本操作中通常以“串的整体”作为操作对象。例如在串中查找某个子串、求取某一个字串、原创 2017-07-03 10:43:09 · 529 阅读 · 0 评论 -
获取字符串中的子串
下列代码实现了:去除字符串中空格字符串的分割去除字符串中空格的基本思想:从字符串第一个字符串开始遍历,若遇到空格,就将空格后的字符前移,重复直至遍历到字符串结束。提取主字符串中的子串的基本思想:使用一字符指针数组,将主字符串中的子串分离出来,每分离出来一个子串就为该子串另外分配空间,并存入指针数组。值得注意的是:指针数组初始时自己并不带有那么多的地址空间,它只是通过指针,来原创 2017-07-05 14:21:36 · 6234 阅读 · 0 评论 -
详解二叉排序树
二叉排序树的插入、查找、删除二叉排序树的定义二叉排序树右称二叉查找树。或者为空树,或者是具有以下性质:(1)若它的左子树不为空,则左子树所有节点的值小于根结点,(2)若它的右子树不为空,则根结点的值小于所有右子树结点的值(3)它的左右子树叶分别为二叉排序树总结起来就是根据结点的值有:左子树根结点右子树如下图就是一棵二叉排序树它的中序遍历:1原创 2017-07-17 22:56:27 · 22287 阅读 · 5 评论 -
java面试中的二叉树题目汇总
二叉树和链表一样,首先都应该想到递归。所以本文中尽量都用递归和非递归完成每一题1.二叉树的遍历,前序中序后序,递归和非递归2.二叉树的层序遍历3.二叉树的高度4.二叉树的节点个数5.求二叉树的镜像6.判断两颗二叉树是否互为镜像7.判断一棵树是否本身就是镜像树8.判断两颗二叉树是不是相同的树9.判断树1是不是树2的子结构10.判断二叉树是否是平衡二叉树11.二叉树第k层的节点个数12.二叉树叶子节点的转载 2017-10-20 19:53:25 · 822 阅读 · 0 评论 -
根据中序遍历和后序遍历重建二叉树
二叉树的重建二叉树的重建方法:1、根据前序加中序遍历重建二叉树构造该二叉树的过程如下:1. 根据前序序列的第一个元素建立根结点;2. 在中序序列中找到该元素,确定根结点的左右子树的中序序列;3. 在前序序列中确定左右子树的前序序列;4. 由左子树的前序序列和中序序列建立左子树;5. 由右子树的前序序列和中序序列建立右子树。2、根据中序加后序遍历重建二原创 2017-10-14 23:01:42 · 11332 阅读 · 2 评论 -
树的双亲孩子表示法
完成了图的邻接表表示法,发现它的存储结构与树的孩子链表表示法相似,都是由一个数组加若干邻接链表形成的结构。只是在构造和遍历时有所区别。 在孩子链表中查找兄弟结点比较困难,查找孩子和双亲很方便,故适用于对孩子操作较多的应用。结构图示为:下面是c语言代码实现:#include<stdio.h>#include<stdlib.h>#define MAXNODE 20typedef char E原创 2016-12-08 11:29:20 · 7433 阅读 · 4 评论 -
树的双亲表示法
由于树中的每个结点都有唯一的一个双亲结点,所以可用一组连续的存储空间(一维数组)存储树中的各个结点,数组中的一个元素表示树中的一个结点,每个结点含两个域,数据域存放结点本身信息,双亲域指示本结点的双亲结点在数组中位置。C语言代码实现:#include<stdio.h>#include<stdlib.h>#define MAX_SIZE 20typedef char ElemType;type原创 2016-12-09 20:55:32 · 21162 阅读 · 9 评论 -
队列建立完全二叉树
完全二叉树是由满二叉树而引出来的。对于深度为K的,有n个结点的二叉树,当且仅当其每一个结点都与深度为K的满二叉树中编号从1至n的结点一一对应时称之为完全二叉树。比如下面这棵树就是一棵完全二叉树通过图片我们可以了解到它的创建过程是从上到下,从左至右的,也就是说,它是一层一层建立的。完全二叉树有以下基本性质:对于一棵有n个结点的完全二叉树,其任意结点 i (1<=i<=n),如果 i = 1, 则结点原创 2016-11-05 09:19:28 · 5112 阅读 · 1 评论 -
线性表之顺序操作
/ *顺序表 数组a[i],有一个基址a 相当于&a[0],还有下标i,代表第i 个元素, *数组的最大容量,假定声明一个数组为a[10],则该数组的容量为10 化为指针形式 a[i] = (a+i),[]就相当于* *要注意的是a是一个常量,它代表的是数组的首地址,是不可以发生变化的 *关于数组的扩容,从新给数组分配空间始终在原有的基址上进行操作 *数组元素的插入和删除操作,就要相应原创 2016-10-03 12:20:24 · 482 阅读 · 0 评论 -
单链表-建立插入删除
建立一个工程,在其中添加 list.h 头文件,list.cpp源文件和main.cpp源文件。原创 2016-09-10 22:40:57 · 738 阅读 · 0 评论 -
链式队列
队列:先进先出(FIFO),队列是一种特殊的线性表,特殊之处在于它只允许在表的前端(front)进行删除操作,而在表的后端(rear)进行插入操作,和栈一样,队列是一种操作受限制的线性表。进行插入操作的端称为队尾,进行删除操作的端称为队头。#include<stdio.h>#include<stdlib.h>#include<assert.h>typedef struct Qnode{原创 2016-10-17 17:57:10 · 502 阅读 · 0 评论 -
线索二叉树
我们知道,一颗二叉树不总是有两颗子树,也就是存在左子树或右子树为空的情况,这样就造成了存储空间的浪费,利用这些空链域来存放结点的前驱和后继的信息,就可以保存在遍历过程中的前驱和后继信息了。我们要将其线索化并用中序遍历的方法输出,按照中序遍历的顺序:先遍历左子树,再遍历根结点,最后遍历右子树,那么,其输出结果应该为:CBDAEF线索二叉树的结构用代码表示为typedef enum{Link,Threa原创 2016-10-20 20:35:38 · 611 阅读 · 0 评论 -
一个关于二叉树的小程序
假设这棵二叉树是这样的 代码实现#include<stdio.h>#include<assert.h>#include<stdlib.h>typedef char ElemType; //定义一个二叉树 typedef struct BiTNode { ElemType data; struct BiTNode *lchild,*rchild; }BiTNode,原创 2016-10-20 21:20:49 · 3530 阅读 · 1 评论 -
冒泡,简单选择,插入排序
#include<stdio.h>void selectsort(int *,int );void maopaosort(int *,int );void insertsort(int *,int );int main() { int a[10] = {1,4,2,0,6,3,8,7,5,9}; int i; printf("排序前:"); for(i=0;原创 2016-12-02 12:26:26 · 361 阅读 · 0 评论 -
更快的查找-哈希表
不得不承认哈希表是一种效率很高的查找方法,理想的情况下它的时间复杂度为o(1),或者为一个常数。当然,哈希查找的高效率也是有一定代价的,具体来说它是一种以时间换空间的查找算法,哈希表的构造需要合适的哈希函数,在构造哈希表时要分配跟多的空间来给记录,在记录发生冲突的时候,我们就需要一些冲突的处理方法。哈希表的构造过程也会因此更加复杂。相关算法不一一例举了,书上和网上都有详细介绍,这里用链地址法来处理冲原创 2016-11-21 16:23:31 · 797 阅读 · 0 评论 -
图的深度优先搜索
深度优先搜索(Depth First Search)遍历类似于树的先序遍历,是树的先序遍历的推广。 无向图的深度优先搜索算法的过程如下: 首先访问出发顶点v,然后选择一个与v相邻接且未被访问过的顶点w访问之,再从w出发开始进行深度优先搜索。 每当到达一个其所有相邻的邻接顶点都已被访问过的顶点,就从该顶点开始,依次退回到尚有邻接顶点未曾被访问过的顶点u,并从u开始进行深度优先搜索。原创 2016-12-07 17:50:49 · 4167 阅读 · 0 评论 -
栈的应用之进制转换
利用栈的后进先出写一个10到8进制转换的小程序,代码如下:#include<stdio.h>#include<stdlib.h>#define stack_size 100#define stack_crement_size 10typedef int Elemtype;///////////////////声明一个栈 typedef struct Stack{ Elemty原创 2016-10-23 21:37:42 · 4177 阅读 · 0 评论