![](https://img-blog.csdnimg.cn/20201014180756928.png?x-oss-process=image/resize,m_fixed,h_64,w_64)
数据结构与算法
文章平均质量分 50
dmfrm
这个作者很懒,什么都没留下…
展开
-
C语言实现二叉排序树
#include <stdio.h>#include <string.h>#include <stdlib.h>/* 定义结构体 */typedef int TypeData;typedef struct stBiTreeNode { TypeData data; struct stBiTreeNode *lchild, *rchild;}BITREENODE;/*原创 2015-08-25 21:57:46 · 3058 阅读 · 0 评论 -
逆波兰表达式C++代码实现
当我们输入一个数学表达式,是中缀表达式,我们首先转换为后缀表达式(逆波兰表达式),然后再进行求值。在《大话数据结构》的104-100页有详细的介绍,下面是我理解之后的代码实现。代码思路:(1)首先对输入的中缀表达式合法性进行判断,bool isStringLegal(const char* str);函数实现。(2)然后把中缀表达式转换为后缀表达式。(3)根据后缀表原创 2015-10-26 18:34:09 · 7999 阅读 · 1 评论 -
[牛客网-左老师]左右最值最大差
给定一个长度为N(N>1)的整型数组A,可以将A划分成左右两个部分,左部分A[0..K],右部分A[K+1..N-1],K可以取值的范围是[0,N-2]。求这么多划分方案中,左部分中的最大值减去右部分最大值的绝对值,最大是多少?给定整数数组A和数组的大小n,请返回题目所求的答案。测试样例:[2,7,3,1,1],5返回#include #include usi原创 2015-11-13 23:08:21 · 1609 阅读 · 0 评论 -
线索二叉树详解以及代码实现
参照《大话数据结构》188到194页。一、二叉树的线索存储结构定义/* 二叉树线索存储结构定义 Link = 0,代表指向左右孩子的指针 Thread= 1 代表指向前驱或后继的线索*/typedef enum{ Link, Thread} PointerTag;typedef char TypeData;typedef struct BiTreeNode{原创 2015-10-30 14:28:22 · 5210 阅读 · 4 评论 -
[牛客网-左老师]最短排序
对于一个无序数组A,请设计一个算法,求出需要排序的最短子数组的长度。给定一个整数数组A及它的大小n,请返回最短子数组的长度。测试样例:[1,5,3,4,2,6,7],7返回:4#include #include using namespace std;/* 时间复杂度为O(n),空间复杂度为O(1) */class ShortSubsequence原创 2015-11-13 21:31:43 · 772 阅读 · 0 评论 -
[牛客网--左老师]局部最小值位置
定义局部最小的概念。arr长度为1时,arr[0]是局部最小。arr的长度为N(N>1)时,如果arr[0]<arr[1],那么arr[0]是局部最小;如果arr[N-1]<arr[N-2],那么arr[N-1]是局部最小;如果0<i<N-1,既有arr[i]<arr[i-1]又有arr[i]<arr[i+1],那么arr[i]是局部最小。 给定无序数组arr,已知arr中任意两个相邻的数都不原创 2015-11-15 21:42:08 · 731 阅读 · 0 评论 -
求二叉树的深度代码实现
用递归的方案实现:/* 求二叉树的深度 */int getDepthBiTree(BITREENODE* T){ int lDepth = 0, rDepth = 0; if(T == NULL) { return 0; } else { lDepth = getDepthBiTree(T->lchild);原创 2015-10-30 23:40:07 · 6502 阅读 · 0 评论 -
求二叉树叶子节点的最浅深度
下面给出一个例子:对于该二叉树而言,叶子节点有C、D两个,C节点的深度为3,D节点的深度为2,那么最浅叶子节点的深度为2。实现代码如下:/* 二叉树存储结构定义*/typedef char TypeData;typedef struct BiTreeNode{ TypeData data; struct BiTreeNode *lchild, *r原创 2015-10-31 14:08:11 · 2946 阅读 · 0 评论 -
斐波那契数列求解的优化
题目:给定整数N,返回斐波那契数列的第N项。解法一:暴力递归,时间复杂度为O(2^N)int fun(int n){ if(n < 1) { return 0; } else if(n ==1 || n ==2) { return 1; } return fun(n-1) + fun(n原创 2015-12-03 15:56:51 · 632 阅读 · 0 评论 -
换零钱--动态规划
题目示例:【题目】给定数组arr,arr中所有的值都为正数且不重复。每个值代表一种面值的货币,每种面值的货币可以使用任意张,再给定一个整数aim代表要找的钱数,求换钱有多少种方法。【举例】arr=[5,10,25,1],aim=0。组成0元的方法有1种,就是所有面值的货币都不用。所以返回1。arr=[5,10,25,1],aim=15。组原创 2015-12-03 21:27:18 · 1509 阅读 · 0 评论 -
求两个数的最大公约数算法
转载地址:http://blog.163.com/xiaoting_hu/blog/static/5046477220136491243567/1.辗转相除法辗转相除法是求两个自然数的最大公约数的一种方法,也叫欧几里德算法。例如,求gcd(319,377):∵ 377÷319=1(余58)∴gcd(377,319)=gcd(319,58);∵ 319÷58=5(余29),转载 2015-12-03 14:57:51 · 3834 阅读 · 0 评论 -
矩阵的最小路径和(空间压缩)
题目:已知矩阵1 3 5 98 1 3 45 0 6 18 8 4 0以1 ,3 ,1, 0 , 6,1 ,0路径和最小,所以返回12 下面代码示例给出通常动态规划解决方法空间复杂度为O(M*N),同时给出空间压缩之后的方法,空间复杂度为O(min{M,N});#include #include #include #include #原创 2015-12-05 15:49:01 · 964 阅读 · 0 评论 -
子数组最大乘积
给定一个double类型的数组arr,其中的元素可正可负可0,返回子数组累乘的最大乘积。例如arr=[-2.5,4,0,3,0.5,8,-1],子数组[3,0.5,8]累乘可以获得最大的乘积12,所以返回12。class Solution {public: double maxProduct(vector arr) { if (arr.empty())原创 2015-12-04 23:44:15 · 559 阅读 · 0 评论 -
动态规划--最长递增子序列
对于一个数字序列,请设计一个复杂度为O(nlogn)的算法,返回该序列的最长上升子序列的长度,这里的子序列定义为这样一个序列U1,U2...,其中Ui 给定一个数字序列A及序列的长度n,请返回最长上升子序列的长度。测试样例:[2,1,4,3,1,5,6],7返回:4代码实现:#include #include #include #include #inclu原创 2015-12-05 14:44:12 · 515 阅读 · 0 评论 -
最小编辑代价(动态规划)
代码实现:对于不同的要求,主要是找到求dp[i][j]的规律。#include #include #include #include #include #include #include using namespace std;#define MAX_LENGTH 50 //字符串的最大长度/* 求出dp[i][j] 代表从str1[0..i],变为str2[0..j原创 2015-12-05 20:58:07 · 1180 阅读 · 0 评论 -
最长公共子序列(动态规划)
【题⺫】给定两个字符串 str1 和 str2,返回两个字符串的最长公共子序列。【举例】str1 =“1 A2 C 3 D 4 B5 6 ”,str2 =“B1 D 2 3 C A4 5 B6 A”。“123456”或者“12C4B6”都是最长公共子序列,返回哪一个都⾏。代码实现:#include #include #include #include原创 2015-12-05 19:31:00 · 441 阅读 · 0 评论 -
图的深度优先遍历和广度优先遍历代码实现
#include #include #include #include #include using namespace std;typedef char TypeData; /* 数据类型 */#define MAXVEX 100 /* 最大顶点数 */#define INFINITY 65535 /* 用65535代表 正无穷 *//* 存储采用邻接矩阵 */原创 2015-11-04 17:07:32 · 15567 阅读 · 0 评论 -
二叉排序树代码实现
参照《大话数据结构》 313 ~328页#include #include #include #include using namespace std;/* 二叉树存储结构定义*/typedef int TypeData;typedef struct BiTreeNode{ TypeData data; struct BiTreeNode *lchi原创 2015-11-03 20:08:25 · 1042 阅读 · 0 评论 -
归并排序代码实现
一、递归代码#include #include #include #include using namespace std;#define MAXSIZE 10/* 将有序的SR[i..m]和SR[m+1...n],归并为有序的TR[i..n] */void Merge(int SR[], int TR[], int i, int m, int n);/*原创 2015-11-03 21:21:40 · 499 阅读 · 0 评论 -
数据结构:树、森林和二叉树的转换
1、树转换为二叉树(1)加线。在所有兄弟结点之间加一条连线。(2)去线。树中的每个结点,只保留它与第一个孩子结点的连线,删除它与其它孩子结点之间的连线。(3)层次调整。以树的根节点为轴心,将整棵树顺时针旋转一定角度,使之结构层次分明。(注意第一个孩子是结点的左孩子,兄弟转换过来的孩子是结点的右孩子)2、森林转换为二叉树(1)把每棵转载 2015-08-28 10:24:51 · 1917 阅读 · 0 评论 -
数据结构:C语言实现构建哈夫曼树
哈夫曼树(霍夫曼树)又称为最优树.1、路径和路径长度 在一棵树中,从一个结点往下可以达到的孩子或孙子结点之间的通路,称为路径。通路中分支的数目称为路径长度。若规定根结点的层数为1,则从根结点到第L层结点的路径长度为L-1。2、结点的权及带权路径长度 若将树中结点赋给一个有着某种含义的数值,则这个数值称为该结点的权。结点的带权路径长度为:从根结点到该结点之间的路径长度与该结点的原创 2015-08-28 15:08:12 · 18856 阅读 · 3 评论 -
数据结构 C语言实现快速排序
一、快速排序简介快速排序采用分治的思想,第一趟先将一串数字分为两部分,第一部分的数值都比第二部分要小,然后按照这种方法,依次对两边的数据进行排序。二、代码实现#include <stdio.h>/* 将两个数据交换 */void swap(int* Ina , int* Inb){ int temp = *Ina; *Ina = *Inb; *Inb = temp;}原创 2015-08-19 14:43:50 · 1734 阅读 · 0 评论 -
C语言实现 前序、中序、后序遍历二叉树
1、代码实现#include <stdio.h>#include <stdlib.h>/* 定义数据类型 */typedef char TypeData ;/* 定义二叉树 */typedef struct stBiTreeNode{ TypeData data; struct stBiTreeNode *lchild, *rchild;}BITREENODE;/* 初始化原创 2015-08-17 19:15:17 · 21854 阅读 · 9 评论 -
数据结构 C语言实现选择排序
一、选择排序简介选择排序是外层进行n-1趟排序,内层进行n-1趟排序,每一趟选出最大或最小的数据放在最前面。二、代码实现#include <stdio.h>/* 将两个数据交换 */void swap(int* Ina , int* Inb){ int temp = *Ina; *Ina = *Inb; *Inb = temp;}/** 函数功能:选择排序,把数据从原创 2015-08-19 14:59:17 · 815 阅读 · 1 评论 -
数据结构 C语言实现冒泡排序
一、冒泡排序简介冒泡排序是相邻的两个数进行比较,每次把最大的或最小的放到后面。二、代码实现#include <stdio.h>/* 将两个数据交换 */void swap(int* Ina , int* Inb){ int temp = *Ina; *Ina = *Inb; *Inb = temp;}/** 函数功能:冒泡排序,把数据从小到大排序* 参数解释:In原创 2015-08-19 15:04:37 · 5049 阅读 · 0 评论 -
数据结构的各种排序算法稳定性比较
一、前面有讲到了9种排序算法:1.简单选择排序 2.堆排序 (1和2是属于选择排序)3.直接插入排序 4.希尔排序 (3和4属于插入排序,有时把改进后的直接插入排序叫做二分插入)5.冒泡排序 6.快速排序 (5和6属于交换排序.交换排序顾名思义是不停的交换数据位置.但实际上选择排序也在不停的交换元素,但次数较少,只有找到最大值才一次交换.侧重点还是在通过遍转载 2015-08-19 11:06:13 · 4625 阅读 · 0 评论 -
数据结构 C语言实现直接插入排序
一、直接插入排序简介 每次从无序表中取出第一个元素,把它插入到有序表的合适位置,使有序表仍然有序。 第一趟比较前两个数,然后把第二个数按大小插入到有序表中; 第二趟把第三个数据与前两个数从前向后扫描,把第三个数按大小插入到有序表中;依次进行下去,进行了(n-1)趟扫描以后就完成了整个排序过程。二、C语言代码实现#include <stdio.h>/* 将两个数据交换 */void swap(in原创 2015-08-19 18:03:46 · 4083 阅读 · 0 评论 -
数据结构 C语言实现希尔排序
一、希尔排序简介 先将整个待排元素序列分割成若干个子序列(由相隔某个“增量”的元素组成的)分别进行直接插入排序,然后依次缩减增量再进行排序,待整个序列中的元素基本有序(增量足够小)时,再对全体元素进行一次直接插入排序。因为直接插入排序在元素基本有序的情况下(接近最好情况),效率是很高的,二、C语言代码实现#include <stdio.h>/* 将两个数据交换 */void swap(int*原创 2015-08-19 22:25:10 · 1573 阅读 · 1 评论 -
广义表的head与tail的基本用法
广义表最基本的操作:取表头head(LS)与取表尾tail(LS)例:LS=(a,(b,c,d))head(LS)=atail(LS)=((b,c,d))head(tail(LS))=(b,c,d)tail(tail(LS))=()head(head(tail(LS)))=btail(head(tail(LS)))=(c,d)head(tail(head(tail(转载 2015-09-12 21:07:12 · 62531 阅读 · 9 评论 -
KMP算法代码实现
有关KMP算法,这里有篇博客讲解的特别好,博客链接为:http://blog.csdn.net/tukangzheng/article/details/38438481下面是我实现的代码:#include #include #include #include using namespace std;/* 得到字符串的next数组 */int getNextA原创 2015-09-15 14:18:45 · 642 阅读 · 0 评论 -
C语言全排列算法实现
23原创 2015-09-01 22:41:15 · 10245 阅读 · 0 评论 -
next数组介绍
首先看看next数组值的求解方法例如: 模式串 a b a a b c a c next值 0 1 1 2 2 3 1 2 next数组的求解方法是:第一位的next值为0,第二位的next值为1,后面求解每一位的next值时,根据前一位进行比较。首先将前一位与其next值对应的内容进行比较,如果相等,则该位的next值就是前一位的next值加上1;如果转载 2015-09-13 20:49:48 · 4443 阅读 · 0 评论 -
洗牌算法:随机打乱一个数组
解题思路: 随机的取出一个(0 - n)之间的数据与a[0]交换。 随机的取出一个(1 - n)之间的数据与a[1]交换。 随机的取出一个(2 - n)之间的数据与a[2]交换。 …………….. 随机的取出一个(n-1 - n)之间的数据与a[n-1]交换。代码实现:#include <stdio.h>#include <time.h>#i原创 2015-08-27 11:18:29 · 1246 阅读 · 1 评论 -
最长公共字串(动态规划)
【题目】给定两个字符串 str1 和 str2,返回两个字符串的最长公共子串。【举例】str1 =“1AD12345CD ”,str2 =“12345EF”。返回“12345”。【要求】如果str1 长度为M,str2长度为N,实现时间复杂度为O(M*N),额外空间复杂度为O(1)的方法。代码实现:#include #include原创 2015-12-05 20:02:22 · 488 阅读 · 0 评论