数据结构

数据结构复习(二)

大兔子大兔子 提交于 2020-02-08 17:05:50
六、特殊矩阵、广义表及其应用 行序列序: 以行序为主序存储:对一个具有m行、n列的二维数组A m*n ,线存储第一行,再存储第二行,到m行 以列序为主序存储:对一个具有m行、n列的二维数组A m*n ,线存储第一列,再存储第二列,到m列 来源: https://www.cnblogs.com/nbxcnxvcnb/p/12283735.html

非线性数据结构——树

微笑、不失礼 提交于 2020-02-08 16:52:52
树 非线性数据结构定义:也就是每个元素可以有多个前驱和后继。树是一种非线性结构。它可以有两种定义。 第一种:树是n(n>=0, n为0时,称为空树 )个元素的集合,它只有 一个特殊的没有前驱的元素 ,这个元素成为树的 根(root) ,而且 树中除了根节点外,其余的元素都只能有一个前驱,可以有0个或者多个后继。 第二种递归定义:树T是n(n>=0,n为0时,称为空树)个元素的集合,它有且只有一个特殊元素根,剩余元素都可以被划分为M个互不相交的集合T1,T2,T3……、Tm,而每一个集合都是树,称为T的子树subtree,同时,子树也有自己的根。 维基百科是这样定义的: 树中的概念 结点: 树中的数据元素,也就是上图中的,A,B,C,D,E,F,G…… 结点的度degree :节点拥有的子树的数目称为度,记作d(v)。 叶子结结: 节点的度为0,称为叶子节点leaf,终端节点,末端节点。 分支结点: 节点的度不为0,称为非终端节点或分支节点。 分支: 节点之间的关系。 内部节点: 除根节点外的分支节点,当然也不包括叶子节点。 树的度: 树内各节点的度的最大值,比如下面这个图D节点的度最大为3,所以树的度数就是3. 孩子(儿子child)节点: 节点的子树的根节点成为该节点的孩子。 双亲(父parent)节点: 一个节点是他各子树的根节点的双亲。 兄弟(sibling)节点:

数据结构——堆排序

╄→гoц情女王★ 提交于 2020-02-08 16:44:36
堆排序算法就是通过维护一个小根堆或者大根堆的数据结构。小/大根堆本质上是一个完全二叉树。利用了完全二叉树的性质,即完全二叉树节点x的子节点编号为2x和2x+1。 利用这个性质,我们可以让一个一维数组来模拟这个二叉树,数组下标从1开始建立,下标为2*x和2*x+1的就是x的左子树和右子树。 #include<bits/stdc++.h> using namespace std; const int N = 100010; //h[n]是堆数组(一维存储) int h[N]; //s表示的是堆的大小,就是size int s; //向下维护堆(此代码是小根堆) void down(int x){ int t = x; //判断x是否小于左右子节点 if( x*2 <= s && h[x*2] < h[t]) t = x*2; if( x*2+1 <= s && h[x*2+1] < h[t]) t = x*2+1; //如果x小于了左右子节点,则交换数值 if( t != x){ swap(h[t],h[x]); //递归维护子节点的子节点 down(t); } return ; } int main(){ ios::sync_with_stdio(0); cin.tie(); int n,m; cin>>n>>m; for(int i = 1 ; i <= n ; i ++ ){

数据结构二叉树的查找与遍历

Deadly 提交于 2020-02-08 13:47:46
二叉树的查找与遍历 1、有n个结点的满二叉树,计算它的度为1的结点数目、叶子结点的数目。 设度为1的结点数目为n1,叶子结点数目为n0,度为2的结点数目为n2,因该二叉树为满二叉树,所以度数为1的结点数目为0,然后根据n0=n2+1;又因为n=n0+n2;所以n=2n0-1;所以叶子结点数目为n0=2n0/2; 2、已知完全二叉树的第7层上有10个叶子,则该二叉树至多有多少个结点? 该二叉树结点数达到最大值,深度为因为8,最少深度可以为7,前七层应为满二叉树, 第七层的叶子应为本层的最右边,第8层的结点数目为(27-1_ 10)*2=108,这颗二叉树的总结点为 (27-1_ 10)*2+ (27-_ 1)=235 3、已知某度为k的树中,其度为0、1、2、…、k-1的结点数分别为n0、n1、n2、…、nk-1。求该树的结点总数n,并给出推导过程。 设该树中的叶子数为n0个。该树中的总结点数为n个,则有: n=n0+n1+n2+…+nK (1) n-1=0*n0+1*n1+2*n2+…+K*nK (2) //去掉根结点 联立(2)-(1)方程组可得: 叶子数为:n0=1+0*n1+1*n2+2*n3+...+(K-1)*nK ∴树的结点总数n=k 来源: CSDN 作者: zhupengqq1 链接: https://blog.csdn.net/zhupengqq1/article

数据结构和算法思维导图

拈花ヽ惹草 提交于 2020-02-08 13:35:07
需要重点以下10种数据结构和10种算法: 10 个数据结构:数组、链表、栈、队列、散列表、二叉树、堆、跳表、图、Trie 树 10 个算法:递归、排序、二分查找、搜索、哈希算法、贪心算法、分治算法、回溯算法、动态规划、字符串匹配算法 来源: https://www.cnblogs.com/gaopengpy/p/12276035.html

java 数据结构与算法---树

时光怂恿深爱的人放手 提交于 2020-02-08 11:23:48
一、树的概念 除根节点外,其余节点有且只有一个父节点。 1、度 节点的度 :每个节点的子节点个数。 树的度 :树内各个节点的度的最大值。 树的高度(深度) :树中节点的最大层次称为树的深度。 节点路径 :一个节点到另外一个节点的连线(树种该路径有且只有一条)。例如:B到J节点如果有两条路径,那么该结构就不是树。 子树 :除根节点外的节点就是子树。 叶子结点: 一棵树当中没有子结点的结点称为叶子结点(即度为0的节点),简称“叶子”。 堂兄弟节点 :双亲在同一层的节点互为堂兄弟; 二树的分类 顺序分: 有序树:树中节点的各子树从左至右是有序的、且不能互换。 无序树:树中节点的各子树从左至右是无序的、且能互换。 二、树的存储结构 简单的顺序存储是无法满足树的要求,一般我们结合顺序存储与链式存储来实现。 常用三种方式 1、双亲表示发 注释:下标一列我们可以当作是顺序存储通过parent 记录父类的位置;该方式我们我们找某个元素的父元素很简单,但是找子元素就相对复杂。 2、双亲孩子表示法 注释:该方式将双亲表示发与孩子表示法相结合 数组+链表 (HashMap的数据结构),该方式找孩子节点简单。 3、孩子兄弟表示发 注释:该方式找元素的子元素容易,但找父元素相对复杂。 来源: https://www.cnblogs.com/jalja/p/9000168.html

『嗨威说』数据结构 - 第三章学习内容小结

删除回忆录丶 提交于 2020-02-08 09:37:43
本文内容: 本章内容小结 完成作业或实践时解决困难的经验分享 参考资料、说明推荐理由及列出相关链接(或书目名称,具体页码) 目前学习过程中存在的困难,待解决或待改进的问题 接下来的目标 一、本章内容小结:(栈与队列)   (1)基本概念: 栈(Stack): 只允许在一端进行插入或删除操作的线性表。首先栈是一种线性表,但是限定这种线性表只能在某一端进行插入和删除操作 栈顶(top): 线性表允许进行插入和删除的那一端。(开口的那一端) 栈底(bottom): 固定的,不允许进行插入和删除的另一端。(封死的那一端) 空栈: 不含任何元素的空表。 栈的两种表示方式: 栈的本质是线性表,那么它就同样有线性表的两种表示形式:顺序栈 和 链式栈(简称“链栈”) 两者的区别:存储的数据元素在物理结构上是否是相互紧挨着的。顺序栈存储元素预先申请连续的存储单元;链栈需要即申请,数据元素不紧挨着。 栈的“上溢”和“下溢”问题: “上溢”:在栈已经存满数据元素的情况下,如果继续向栈内存入数据,栈存储就会出错。(栈满还存会“上溢”) “下溢”:在栈内为空的状态下,如果对栈继续进行取数据的操作,就会出错。(栈空再取会“下溢”) 对于栈的两种表示方式来说,顺序栈两种情况都有可能发生;而链栈由于“随时需要,随时申请空间”的存储结构,不会出现“上溢”的情况。 栈的基本操作:   InitStack(&S)

数据结构——线性表之链式存储结构

吃可爱长大的小学妹 提交于 2020-02-08 09:16:51
单链表: 概念: 1、由于线性表的顺序存储在插入与删除时需要移动大量元素,适用于不经常改变元素的情况,那么当我们需要经常操作元素时该怎么办,这就有了接下来的线性表的链式存储结构 2、单链表在内存的存储位置不一定是一段连续的位置,它可以存放在内存中任何地方 3、单链表中除了用于存放数据的数据域外,还有存放指针的指针域,指针域的作用是指向链表的下一个节点(因为链表的元素在内存中的存放时任意位置的,所以需要指向下一个节点) 4、单链表第一个节点存储的位置叫做头指针,整个单链表的存取都是从头指针开始,单链表的最后一个节点是指针指向空(NULL) 单链表的操作: 1 package com.alibaba.test03; 2 3 import org.junit.jupiter.api.Test; 4 5 6 /** 7 * 1. 单链表的具体实现及操作 8 * @author wydream 9 * 10 */ 11 12 public class SingLeLinkedList { 13 14 private int size;//链表节点的个数 15 private Node head;//头结点 16 17 public SingLeLinkedList() { 18 size=0; 19 head=null; 20 } 21 22 //链表中的每个节点类 23 private

排序算法

社会主义新天地 提交于 2020-02-08 05:13:18
排序算法 文章目录 排序算法 1.数据结构定义 2.冒泡排序 3.冒泡排序的改进 4.简单选择排序 5.直接插入排序 6.希尔排序(相当于直接插入排序的升级,先搞懂插入排序) 7.堆排序(相当于简单选择排序的升级) 8.归并排序 9.快速排序(冒泡排序的升级) 参考 1.数据结构定义 # define MAXSIZE 10000 /* 用于要排序数组个数最大值,可根据需要修改 */ typedef struct { int r [ MAXSIZE + 1 ] ; /* 用于存储要排序数组,r[0]用作哨兵或临时变量 */ int length ; /* 用于记录顺序表的长度 */ } SqList ; /* 交换L中数组r的下标为i和j的值 */ void swap ( SqList * L , int i , int j ) { int temp = L -> r [ i ] ; L -> r [ i ] = L -> r [ j ] ; L -> r [ j ] = temp ; } 2.冒泡排序 平均时间复杂度:O(n2) 从后往前依次比较相邻的两个数,如果后面的数比较小就交换位置,这样的话每循环一次就会有一个最小值被换到最前面了,然后再依次把其他的数冒上去。 go语言实现: // BubbleSort 冒泡排序 func BubbleSort ( array [ ] int

数据结构 C++ 单链表 一元多项式的相加

半腔热情 提交于 2020-02-08 05:10:50
#include <iostream> using namespace std; struct Node { double coe; //系数 int exp; //指数 Node *next; }; void CreatPoly(Node *&head, int n) // 生成带表头结点的单链表,除头结点外另生成n个结点 { head = (Node *)new Node; head->coe = 0; head->exp = 0; head->next = NULL; // 初始化头结点 cout << "分别每行输入各项系数及指数:" << endl; Node *p = head; for(int i = 0; i < n; i++) { p->next = (Node *)new Node; // 生成新结点,尾插入生成链表 p = p->next; cin >> p->coe >> p->exp; p->next = NULL; } } void ShowPoly(Node *&head) { if(head->next == NULL) // 结果是0时直接输出0 putchar('0'); else { for(Node *p = head->next; p != NULL; p = p->next) { if(p != head->next && p->coe