![](https://img-blog.csdnimg.cn/20190927151101105.png?x-oss-process=image/resize,m_fixed,h_224,w_224)
数据结构与算法
本专栏仅供学习交流
青铜世纪
Talk is cheap. Show me the code.
展开
-
【数据结构与算法】二叉搜索树的5种常用操作
二叉搜索树的5种常用操作函数接口定义:BinTree Insert( BinTree BST, ElementType X );BinTree Delete( BinTree BST, ElementType X );Position Find( BinTree BST, ElementType X );Position FindMin( BinTree BST );Position FindMax( BinTree BST );BinTreetypedef struct TNode *P原创 2021-08-26 10:26:16 · 488 阅读 · 0 评论 -
【数据结构与算法】AVL平衡二叉树
AVL树平衡二叉树由于自动调整左右子树的平衡,可以保证在不断插入删除数据时有着较高的查找效率平衡因子BF(Balance Factor)BF=左子树高度减右子树高度对于平衡二叉树来说,平衡因子只可能为{0,1,-1},绝对值一旦大于1就会造成不平衡。原理与处理方法共有四种类型:LL , LR , RR , RL,解决这四种类型有相应的办法。1. LL(1) 情形:插入结点在距离最近的不平横根结点(P)(即平衡因子绝对值大于1)的左子树(L)的左子树(ll)上(2) 方法:先只关注P原创 2021-08-25 16:47:18 · 171 阅读 · 0 评论 -
【数据结构与算法】KMP算法
KMP算法思想朴素的匹配算法是一对一的匹配,每次匹配失败主串和模式串上的指针都回退到开头,但实际上这种回退是没有必要的而KMP算法通过对模式串的处理进而减少回退次数时间复杂度T=O(n+m)实现typedef int Position;#define NotFound -1void BuildMatch(Position match[],char *pattern,int len){ match[0]=-1; for(Position j=1;j<len;原创 2021-08-25 15:44:30 · 184 阅读 · 0 评论 -
【数据结构与算法】2.5 Tree Traversals Again
Sample Input:6Push 1Push 2Push 3PopPopPush 4PopPopPush 5Push 6PopPopSample Output:3 4 2 6 5 1思路我们通过观察发现出栈的序列为 3 2 4 1 6 5 前序遍历入栈顺序为 1 2 3 4 5 6 中序遍历题目想让我们输出后序遍历的结果到这里本题就十分明了了由前序遍历和中序遍历求解后序遍历前序遍历的特点是,第一个是根结点先输出,利用这个特性我们可以在中序遍历中确..原创 2021-08-25 15:34:52 · 110 阅读 · 0 评论 -
【数据结构与算法】2.8 Pop Sequence
Sample Input:5 7 51 2 3 4 5 6 73 2 1 7 5 6 47 6 5 4 3 2 15 6 4 3 7 2 11 7 6 5 4 3 2Sample Output:YESNONOYESNO思路本题主要模拟出进栈出栈操作即可考虑到栈先进后出的特点,将待检查序列逆序插入栈中然后再规定另一个大小为size的栈,将序列1-N进栈,每次进栈都检查两个栈栈顶元素是否相同,如果相同,则分别将两个栈栈顶元素弹出,循环执行直到栈顶元素不等,然后继续插入元..原创 2021-08-25 15:32:40 · 208 阅读 · 0 评论 -
【数据结构与算法】玩转二叉树
输入样例:71 2 3 4 5 6 74 1 3 2 6 5 7输出样例:4 6 1 7 5 3 2思路本题考察由前序中序获得完整二叉树并获得层序遍历结果,其实并不是很难。关键点有两个:由前序中序建立二叉树(用链式结构存储较简单)将建立的二叉树层序遍历,层序遍历时要逆序输出(可以考虑使用队列或栈)#include<bits/stdc++.h>using namespace std;#define For(i,a,b) for(int i=a;i<b.原创 2021-08-25 15:29:52 · 609 阅读 · 0 评论 -
【数据结构与算法】最小生成树
实现最小生成树的两种算法最小生成树Prim算法Kruskal算法PTA习题(村村通)最小生成树Prim算法从一个根结点开始让树慢慢长大随便选择一个结点作为根结点加入顶点集合从该结点的所有边中选择一个权重最小的然后将该边连接的顶点加入集合从集合中的所有顶点所连接的边中选出一条权重最小且不会构成闭环的边并将其连接的顶点加入集合循环上一步直到所有顶点都被收录/* 邻接矩阵存储 - Prim最小生成树算法 */Vertex FindMinDist( MGraph Graph, Weight原创 2021-08-22 22:12:10 · 213 阅读 · 0 评论 -
【数据结构与算法】基础排序
排序总结基础排序算法总览冒泡排序直接插入排序快速排序希尔排序堆排序基础排序算法总览排序方法平均时间复杂度最坏时间复杂度额外空间复杂度稳定性简单选择排序O(N^2)O(N^2)O(1)不稳定冒泡排序O(N^2)O(N^2)O(1)稳定直接插入排序O(N^2)O(N^2)O(1)稳定希尔排序O(N^d)O(N^2)O(N)不稳定堆排序O(NlogN)O(NlogN)O(1)不稳定快速排序O(NlogN)O(原创 2021-08-22 21:36:20 · 98 阅读 · 0 评论 -
【数据结构与算法】快速排序
快速排序算法图解算法实现算法性能分析关于快排的三个问题小结算法图解算法实现分区函数int partition(int a[],int l,int r)//将选取的pivot放在中点,使pivot左边的数小于它,右边的数大于它//最后返回枢纽的位置{ int key=a[l]; while(l<r) { while(l<r&&a[r]>=key) r--; a[l]=a[r];原创 2021-06-29 11:37:04 · 217 阅读 · 0 评论 -
【数据结构与算法】归并排序
归并排序算法图解算法实现算法性能分析关于归并排序的两个问题小结算法图解归并排序的核心思想便是先分解子区间再将子区间合并并排序。也就是分治思想。算法实现首先分解子区间一个大区间不好处理,就分解为两个小区间,所以将小区间再放入排序函数内,执行完两行后,两个小区间内的元素已经分别有序了,再将两个小区间和并,合并的同时再排序,这时大区间的元素也有序了。void mergesort(int a[],int l,int r)//分解区间{ if(l>=r)return; int原创 2021-06-29 10:44:17 · 89 阅读 · 0 评论