数据结构
文章平均质量分 57
上课数据结构的学习笔记!
_-周-_
hhhhhhhhhhhhhh
展开
-
二叉树的叶结点/ 树的深度计算
二叉树叶子结点的计算:二叉树叶子结点总数等于左子树的叶子结点 + 右子树的叶子结点,判断是不是叶子结点 , 如果是返回1 ,如果不是叶子结点,继续递归。线序计算二叉树结点个数:首先定义一个全局变量 leftNum, 如果是叶子结点,就让叶子结点计数器leftNum++;如果不是叶子结点,就递归子树,找子树的叶子结点,遇见叶子结点,计数器leftNum++;int BiTree::CountLeaf(node *bt){ if(bt->lchild==NULL &a.原创 2021-11-29 13:57:33 · 6423 阅读 · 0 评论 -
Kruskal算法--学习笔记
1.最小生成树是在图 (邻接矩阵) 中选择出一个权值累加和最小的树,所以自己首先需要构建一个图(邻接矩阵)。Kruskal和prim算法在存储结构上不同,因为Kruskal算法需要或者哪个是最短边,之前的存储方式需要遍历所有边才能知道哪个是最短边.问题1.如何判断被考察边的两个顶点是否位于两个连同分量? 答:根据所属的树是否有相同的根节点。...原创 2021-10-27 23:01:10 · 226 阅读 · 0 评论 -
AOV网--拓扑排序(必须是一个有向无环图)
特点: 1. AOV网用顶点表示活动,用弧表示活动之间优先关系, 2. AOV网中的弧表示活...原创 2021-11-10 15:38:23 · 2346 阅读 · 0 评论 -
直接插入排序
方法类似于玩纸牌,基本思想是: 依次将待排序序列中的每一个记录插入到一个已经排好序的序列中,直到全部记录都排好序。排序过程:首先给定一个序列,序列是从i=1开始存储元素, 默认第一个元素是有序的.注意: 直接插入...原创 2021-11-12 15:36:52 · 844 阅读 · 0 评论 -
二叉排序树
性质: 1. 若它的左子树不空,则左子树上所有结点的值均小于根节点的值 2. 如果它的右子树不空,则右子树上所有结点的值均大于根节点...原创 2021-11-11 22:26:33 · 756 阅读 · 0 评论 -
散列表的构建
散列表需要将关键码用散列技术进行存储,才可以进行散列查找,散列函数------除留余数法,开放定址法-----线性探测法(如果地址冲突,那就判断(a[i]+1)%p是否冲突,若不冲突,则放入数据, 若冲突,继续加1取余 )处理冲突的方法-----拉链法(链地址法)...原创 2021-11-11 22:53:26 · 1555 阅读 · 0 评论 -
折半查找-
要求线性表中的记录必须是关键码有序,线性表必须采用顺序存储。思路:在有序表中,取中间记录作为比较对象, 若给定的值与中间记录的关键码相等,则查找成功,若给定的值小于中间记录的关键码,则在中间记录的左半区继续查找; 若给定的值大于中间记录的关键字,那就在中间记录的右半区查找, 不断重复,直到查找成功, 或者查找失败int Binart_Search(int a[], int n, int key){ int low, high,mid; //此数组从索引为1的位置开始查找 low ...原创 2021-11-10 16:24:23 · 1426 阅读 · 0 评论 -
AOE网(带权有向无环图)
1. 用顶点表示事件, 用有向边表示活动,边上的权值表示活动的持续时间。 (事件:例如:完成外壳的生产, 活动:如生产外壳) 2. AOE网中没有入边的顶点称为源点,没有出边的顶点称为终点AOE网可以回答下列问题:1.完成整个工程至少需要多少时间 2. 为缩短完成工程...原创 2021-11-12 08:59:34 · 3890 阅读 · 0 评论 -
Dijkstra算法(最短路径)
U为源点 S为未添加数组 邻接矩阵存放的是权值,创建dist[]数组,用来存放结点间的距离,首先将v结点加入U集合,之后更新dist[]数组的数值,再在U-S集合中找到一个权值最小的结点x,遍历x这一行,查看x到各个结点的距离,当x结点到m结点距离为5,此时用这个5去和dist[]数组到x的距离相加,如果相加得到的值比dist[]数组中的值小,则用这个值更新diist[]数组中到m中的权重值 ; 再次在dist[]数组中找最短路径**在dist数组中找最短路径是在未添加的数组值那查找,已经添加到源点的...原创 2021-10-31 17:53:15 · 16249 阅读 · 1 评论 -
c/c++ 图, 创建邻接表, 邻接表的深/广度优先遍历
邻接矩阵深度广度优先遍历原创 2021-10-24 15:09:27 · 5117 阅读 · 1 评论 -
C++两栈共享空间
两栈共享空间就是定义一个数组,对数组的两端进行操作的栈。栈的插入操作步骤:首先判断栈是否已经满了, 当top1 = top2 - 1时候,说明栈已经满了,不能再插入了否则没有满,判断要往那个栈插入,往栈1插入,就--top1,因为从前往后插, 如果是栈2,就--top2,因为是从数组后往插入,所以插入的索引位置应该往前移动.const int MAXSIZE = 100;class stack{ public: int data[MAXSIZE]; ..原创 2021-10-17 11:03:17 · 884 阅读 · 1 评论 -
C++链队列进队,出队及其他操作
队列图示:创建结点类型:class node{ public: int data; node *next;};建立队列类:class Queue{ public: node *front,*rear; //定义两个结点类型的指针,一个是头用于出队,一个是尾用于入队 Queue(){ front = NULL; rear = NULL; } void push(int x); //入队操作 int pop();原创 2021-10-17 18:33:29 · 1035 阅读 · 0 评论 -
快速排序学习笔记
每个子序列开始,以第一个元素作为中轴int partition(int a[], int first, int end){ int i = first; int j = end; while(i<j){ //这个循环是用来判断是否找到中轴 i<j说明没找到 while(i<j && a[i]<a[j]) //这个循环是,当右边的元素比中轴大时候,移动下标,不交换啊 j--; if(i<j){ //当j元素原创 2021-10-24 18:39:10 · 262 阅读 · 0 评论 -
C/C++ 图---邻接矩阵存储,深度/广度优先遍历
邻接矩阵存储图,深度优先遍历和广度优先遍历,图的创建。原创 2021-10-22 23:07:16 · 2801 阅读 · 0 评论 -
C++根据前序-中序 中序-后序的方式确定二叉树
一.根据前序-中序方式确定二叉树记住两句话,先用前序用来确定根节点,知道根节点后再用中序用来确定根节点的左右子树前序:E, F, H, I, G, J, K 后序:H, F, I, E, J, K, G1.由前序可知,E为根节点, 现在去中序找E结点,E结点左边的元素为E结点的左子树,E结点右边的元素为E结点的右子树,所以H,F,I为E的左子树,J,K,G为E结点的右子树2.再看前序可知,F为根节点,在中序找到F,F结点左边...原创 2021-10-16 19:42:57 · 2032 阅读 · 0 评论 -
简单选择排序
在一个数组中,让min=i,因为每次都网i插入,所以i前面是有序的第一个for循环是用来比较 n-1趟的,第二个for循环是从i开始往后的元素查找最小元素的下标, 当发现一个值比min的小,就更新min的值,这样没找到一个最小的,就给min,下次比较就和这个新的min值比较void selectSort(int r[], int n){ for(int i=0; i<n-1; i++){ //这个for循环是用来控制插入次数, int min = i; .原创 2021-10-24 19:05:05 · 1829 阅读 · 0 评论 -
C++链栈的入栈,出栈及其他操作
如果有什么错误,烦请各位大佬指出了,这只是我的学习笔记.定义栈结点的结构类型class node{ public: int data; node *next;}; 声明栈类,及入栈 和出栈的操作//栈不需要头节点,直接在top指针操作,所以不需要在构造函数中给top申请地址 //插入操作,直接申请一个结点,将top = s;这样对top操作就是对栈顶的操作 class Stack{ public: node *top; Stack(){ //z利用构造函.原创 2021-10-17 12:00:36 · 6012 阅读 · 0 评论 -
哈夫曼树的建立
存储结构:class node{ public: int weight; 权值域,保存该节点的权值 int lchild; 指针域,结点的左孩子在数组中的下标 int rchild; 指针域 结点的右孩子在数组中的下标 int parent; 指针域,该节点的双亲结点在数组中的下标}性质:在构建哈夫曼树的过程,只有出度为0和2的结点,在二叉树中 n0 = n2 + 1 ------》 n2 = n0-1 代入...原创 2021-10-16 23:06:42 · 760 阅读 · 0 评论 -
前序, 中序遍历线索二叉树
//查找某个结点的后继ThreadNode* next(ThreadNode *p) //参数传入一个你想要查找的那个结点的地址,返回该结点的后继结点{ if(p->ltag == 1) //右标志为1,说明是被线索化的后继结点,可直接得到后继结点 { q = p->rchild; //q是一个静态变量或者一个属性变量,直接可以得到他的右孩子 } else //说明他的有右孩子,应该通过递归找下一个结点,但是现在有ltag,.原创 2021-10-14 22:21:18 · 470 阅读 · 1 评论 -
利用前序遍历的方式打印叶子节点
这是我的学习笔记,在我调试代码中发现的错误,可能你也有这样的错误,希望能帮助到你。语句(if bt==NULL)return;在这里是需要的,一开始我没有写这句话,是因为我觉得有if((bt->lchild==NULL)&&(bt->rchild==NULL))语句就够了,但事实运行的时候就会进入死循环 。回头想想确实是有错误,现在来缕一缕思路.解释:如果没有这句话,就会一直调用print_node()函数,当bt->lchild=NULL.原创 2021-10-13 21:25:10 · 336 阅读 · 0 评论 -
C++二叉树的层序遍历
// 先将根节点入队 之后进入循环,当队列不为空时候,开始访问队列元素.首先根节点出队,访问根节点,再将根节点的左右孩子入队,继续循环,访问队列首元素,之后将队列首元素出队并把首元素的左右孩子结点入队,继续循环操作。直到队列为空 void leaver(node *bt){ queue<node*> q; //用STL建立一个队列 if(bt==NULL){ //如果是空树,则退出 return; } else{ ...原创 2021-10-15 18:35:58 · 317 阅读 · 0 评论 -
非递归算法前序中序遍历二叉树
非递归算法遍历二叉树的方式是将该结点的指针保存在栈中,以便以后能通过它找到该结点的右子树.遍历步骤:原创 2021-10-15 11:53:08 · 174 阅读 · 0 评论 -
先序,中序线索二叉树的建立
二叉树的 遍历方式有4种,前序线索二叉树,中序线索二叉树,后序线索二叉树,层序线索二叉树。此处使用中序线索二叉树举例,其他三种建立方式类似,只是代码位置不同。//创建线索二叉树结点结构class node{ public: char data; node *lchild,rchild; int ltag,rtag;};当ltag=0和rtag=0的时候,表示*lchild和*rchild含义不变,任然指向他们的左孩子和右孩子;当.原创 2021-10-13 23:05:05 · 2893 阅读 · 0 评论 -
前序建立二叉树的两种方式
首先给出结点结构和两种创建二叉树方法的声明。1.第一种是通过引用的方式创建二叉树,这样,通过传进来一个指针(地址),可以直接通过引用修改指针内容。2.是把结点指针作为参数赋值,并且将新创建结点的地址返回过去,下面请看代码,用代码解释.#include<iostream>using namespace std;class node{ public: char data; node *lchild,*rchild;};class BiTree{ public:原创 2021-10-13 21:15:28 · 1657 阅读 · 0 评论