
数据结构与算法
数据结构与算法
lucas1018
路漫漫其修远兮,吾将上下而求索
展开
-
红黑树
红黑树也是一棵二叉搜索树,不过在节点上增加了一个保存节点颜色的字段,可以是red或者black。红黑树有如下性质:每个节点或者红色,或者黑色; 根节点是黑色; 每个叶节点(nil)是黑色; 如果一个节点是红色,那么它的两个子节点必然是黑色; 对每个节点,从该节点到所有后代叶节点的简单路径上,黑色节点数目都是相同的。 只有同时满足以上5点,这棵树才能被称为红黑树。当插入或删除某个节点导致其中任意一条性质破坏时,都需要经过旋转或者变色来使其重新满足以上5点。结构体可定义...原创 2020-11-08 22:53:14 · 104 阅读 · 0 评论 -
AVL树
AVL树是一种平衡二叉树,它要求左子树和右子树高度相差至多为1。若高度差大于1,则处于不平衡状态,需要旋转。不平衡状态一般有以下四种情形:对节点T的左儿子的左子树进行一次插入; 对节点T的左儿子的右子树进行一次插入; 对节点T的右儿子的左子树进行一次插入; 对节点T的右儿子的右子树进行一次插入。 情形1和4是关于节点T的镜像对称,情形2和3也是关于节点T的镜像对称。因此我们只需考虑两种情形就够了,也就是情形1和2。 对于情形1,只需进行一次向右...原创 2020-11-05 22:31:29 · 207 阅读 · 0 评论 -
排序汇总
排序算法即是一种能将一串数据依照特定排序方式进行排列的一种算法。本文将简单介绍几种常用的排序算法,并给出源代码,仅供参考。1.直接插入排序:是一种简单直观的排序算法。它的工作原理是通过构建有序序列,对于未排序数据,在已排序序列中从后向前扫描,找到相应位置并插入。插入排序在实现上,通常采用in-place排序(即只需用到O(1)的额外空间的排序),因而在从后向前扫描过程中,需要反复把已排序元素逐原创 2015-05-18 19:27:44 · 603 阅读 · 0 评论 -
线性表链式存储
线性表链式存储结构的创建、删除最小值结点(值唯一)、删除某个指定值(不唯一)、就地逆置、反向输出、递增排序、删除重复结点、根据奇偶序号划分成两个带头结点的单链表。 #include "stdio.h"#include "stdlib.h"typedef struct LNode{ int data; struct LNode *next;}LNode, *llist;原创 2015-05-07 14:47:27 · 415 阅读 · 0 评论 -
线性表顺序存储
线性表顺序存储结构的创建、插入结点、删除结点、就地逆置。#include "stdio.h"#include "malloc.h"typedef struct{ int data[30]; int length;}slist, *List;void init(List); //线性表初始化void insert(List S,原创 2015-05-07 14:33:59 · 365 阅读 · 0 评论 -
二叉树链式存储及相关操作
先序创建二叉树、后序递归遍历二叉树、中序非递归遍历二叉树、层次遍历二叉树、非递归算法求二叉树深度、递归算法求二叉树深度、求分支结点个数、判断是否为完全二叉树、先序遍历第k个结点的值、删除值为k的结点及其子树。#include "stdio.h"#include "stdlib.h"#include "malloc.h"typedef struct TNode //二原创 2015-05-07 23:26:05 · 593 阅读 · 0 评论 -
最短路径:Dijkstra算法和Floyd算法
最短路径问题是图论研究中的一个经典算法问题,旨在寻找图(由结点和路径组成的)中两结点之间的最短路径。算法具体的形式包括: 1.确定起点的最短路径问题:即已知起始结点,求最短路径的问题。适合使用Dijkstra算法。 2.确定终点的最短路径问题:与确定起点的问题相反,该问题是已知终结结点,求最短路径的问题。在无向图中该问题与确定起点的问题完全等同,在有向图中该问题原创 2015-05-16 11:27:53 · 6649 阅读 · 0 评论 -
图的遍历:BFS和DFS
图的遍历是指从图中的某一顶点出发,按照某种搜索方法沿着图中的边对图中的所有顶点进行访问且仅访问一次。图的遍历是图的一种最基本的操作,其他许多操作都是建立在图的遍历操作基础之上。 图的遍历只要有两种:广度优先搜索和深度优先搜索。这里图是以邻接表结构存储。源代码如下:#include "stdio.h"#include "malloc.h"typedef struct原创 2015-05-12 18:38:33 · 585 阅读 · 0 评论 -
最小生成树:prim算法和kruskal算法
一个连通图的生成树是图的极小连通子图。它包含图中的所有顶点,并且只含尽可能少的边。若砍去它的一条边,就会使生成树变成非连通图;若给它增加一条边,则会形成一条回路。最小生成树有如下性质:1.最小生成树非唯一,可能有多个最小生成树;2.最小生成树的边的权值之和总唯一,而且是最小的;3.最小生成树的边数为顶点数减1。构造最小生成树可以有多种算法。其中多数算法利用了最小生成树的下列一种原创 2015-05-14 18:57:03 · 2863 阅读 · 3 评论 -
图的邻接表存储
图有多种存储方式,这里仅介绍较为常用的邻接表存储。源代码如下:#include "stdio.h"#include "malloc.h"typedef struct Node //边表结点结构体定义{ int adjvex; struct Node *next;} Node, *ANode;typedef struct原创 2015-05-12 18:26:42 · 413 阅读 · 0 评论 -
二叉排序树
二叉排序树的创建、插入结点,并以中序遍历输出。#include "stdio.h"#include "malloc.h"typedef struct TNode{ int data; struct TNode *lchild, *rchild;}TNode, *BST;void create(BST &T); //创建根结点void insert(原创 2015-05-11 18:58:17 · 350 阅读 · 0 评论 -
求二叉树宽度
求二叉树宽度算法void width(Tree T) //求二叉树宽度{ int w = 0, wmax = 1, last = -1; Tree p; queue q; q.front = q.rear = -1; if(T == NULL) printf("该二叉树宽度为0!\n"); else { q.data[++q.rear] = T原创 2015-05-08 17:29:36 · 664 阅读 · 2 评论 -
求森林叶子结点数
本文以孩子兄弟表示法存储森林,列出求森林叶子结点的递归与非递归算法。#include "stdio.h"#include "malloc.h"typedef struct CSNode{ int data; struct CSNode *lchild, *rbrother;}CSNode, *Tcsnode;typedef struct{ Tcsnode data[50];原创 2015-05-08 20:48:48 · 4063 阅读 · 1 评论