数据结构与算法
文章平均质量分 54
bobo1356
bboy+程序猿
展开
-
二叉树的前中后序遍历
前中后序遍历的递归方式。其实,前中后序的遍历,走的路径是一样的,只是访问结点的时间不同而已。非递归进行前中后序遍历(使用栈)题目描述:List preorderTraversal(TreeNode root)List inorderTraversal(TreeNode root)List postorderTraversal(TreeNode root)1.前序遍历publ...原创 2020-01-13 01:06:39 · 276 阅读 · 0 评论 -
优先队列/堆的基础
优先队列(堆)的定义和性质定义:优先队列: 特殊的“队列”,取出元素的顺序是按照它的优先级大小,而不是元素进入队列的先后顺序。使用堆来实现优先队列。性质:结构性:用数组表示的完全二叉树。有序性:任一结点是其子树所有结点的最大值(或最小值)。最大堆:maxHeap,也叫大顶堆最小堆:minHeap,也叫小顶堆从根结点到任意结点的路径上,都是有序的。基础操作下面以大顶堆为例进...原创 2020-01-11 23:30:18 · 154 阅读 · 0 评论 -
图的总结
图的表示邻接矩阵,适合稠密图 注意初始化时,自身可以用0表示,不相连的结点可以用负数、正无穷表示,具体要看不同应用的场景。相邻的结点,如果是无权图,可以用1表示;如果是有权图,可以用它们的的权重来表示。邻接表,适合稀疏图图的遍历DFS:深度优先void DFS(结点V){ 访问V visited[V] = true;//标记为已访问 for(V的邻接每个结点W)原创 2017-05-30 14:04:42 · 367 阅读 · 0 评论 -
11-散列2 Hashing (25分)
题目 11-散列2 Hashing (25分)分析 这一道题的难点在于对于那些永远无法插入的数字,何时可以断定它无法插入。 冲突解决方法是平方探测,且只有正数,那么每次冲突后的增量便是:1^2, 2^2, 3^2, 4^2, … , tableSize*2,(tableSize+1)^2, (tableSize+2)^2, … 当达到(tableSize + i)^2 = tableS原创 2017-05-29 16:37:23 · 662 阅读 · 0 评论 -
阿里附加题记录
题目一1.题目要求 2.分析 这就是一个简单的堆栈应用,求后缀表达式的值,不过需要注意的是分隔符为一个或多个空格。可以使用String类的split方法,该方法支持正则表达式,正则表达式 \s 表示匹配任何空白字符,+表示匹配一次或多次。所以这样既可: String[] paras = expr.split("\\s+"); 前面的 \ 表示转义3.代码/*一个对于一个单行的逆波兰表原创 2017-04-27 01:34:29 · 342 阅读 · 0 评论 -
二叉搜索树的基本操作-04-树7 二叉搜索树的操作集 (30分)
题目 04-树7 二叉搜索树的操作集 (30分)分析 就是考察基本的二叉搜索树的操作,基本功,需要注意的是删除操作的一些细节处理。我的代码#include <stdio.h>#include <stdlib.h>typedef int ElementType;typedef struct TNode *Position;typedef Position BinTree;stru原创 2017-05-10 01:08:27 · 745 阅读 · 1 评论 -
根据中序遍历顺序构建完全二叉搜索树-04-树6 Complete Binary Search Tree (30分)
题目要求 04-树6 Complete Binary Search Tree (30分)题目分析 题目就是给出一棵完全二叉搜索树的各个结点的值,然后让我们输出该树层序遍历的结果。 我们首先可以分析一下,完全二叉搜索树 有什么特点?显然可以知道: 1.它是一棵完全二叉树,那么可以用数组方式来存储(如 a[] 来存储)。如果从下标为1开始存储,那么任何一个结点 a[i] ,它的左孩子为 a原创 2017-05-09 18:27:53 · 1749 阅读 · 0 评论 -
图的最短路径问题-07-图6 旅游规划
题目 07-图6 旅游规划 (25分)分析 这道题明显是个单源无向图的最短路径问题,但是这儿注意的是有两个权重:一是距离,二是收费。可以用Dijkstra算法来求解。当距离相等时按照收费来更新最短路。 伪码描述://dist[i]表示结点i到源点S的距离//cost[i]表示结点i到源点S的收费void Dijkstra(源点S){ while(1){ V原创 2017-05-27 00:24:41 · 1617 阅读 · 0 评论 -
AVL树的构建
哇,真的一直不会平衡二叉树的旋转。今天晚上看了好久,也感觉有点似懂非懂。不过推荐大家几个网站,一个是中国大学mooc上面浙江大学陈姥姥讲的数据结构,还有就是这个可视化网站VisuAlgo,看看老师讲的,自己动手多画一画,我觉得慢慢就理解了,记住了。 - 题目 04-树5 Root of AVL Tree (25分) - 分析 本题是2013年浙江大学计算机学院免试研究生上机考试真题,是关原创 2017-05-07 23:27:12 · 791 阅读 · 0 评论 -
二叉搜索树的构建与判别--是否为同一棵二叉搜索树
题目要求 04-树4 是否同一棵二叉搜索树 (25分)分析 我的基本思路是先构建参考树。然后对剩下的输入序列直接判断能否正确地在参考树上检索到。如果是可以,说明是同一棵二叉搜索树,否则不是。 其实还是可以用结构体数组来存储树,我认为用数组存储比用链表存储简单一些。 其次树的大部分操作都可以用递归的方式来处理。如树的插入,序列的检索。我的代码#include <iostream>u原创 2017-05-07 17:08:25 · 268 阅读 · 0 评论 -
树-根据前序、中序遍历求后续遍历
题目要求 03-树3 Tree Traversals Again (25分)分析 我刚开始的想法是直接根据给出的操作构建相应的树,然后后序遍历即可。我的方法一代码import java.util.*;class Tree{ public int left = -1; //-1 meas null public int right = -1;}public原创 2017-05-07 15:15:16 · 530 阅读 · 0 评论 -
树的同构、树的层次遍历输出叶子结点
1、树的同构题目 03-树1 树的同构 (25分)分析 1.程序主体基本上是:int main(){ 建二叉树1; 建二叉树2; 判断是否同构并输出; return 0;}2.如何存储和表示树 经分析,可以直接用数组来存储树。 具体树的表示可以用一个结构体。struct TreeNode{ char data; int L;原创 2017-05-06 16:42:26 · 1040 阅读 · 1 评论 -
排序算法的判别: Insert or Merge,Insertion or Heap Sort
1. 09-排序2 Insert or Merge题目 09-排序2 Insert or Merge (25分)分析 题目输入原始数组和经过若干步插入排序或者归并排序的结果,要我们判断用的是哪个排序,并输出下一步排序的结果。 插入排序比较简单,这儿需要注意的是归并排序最好用非递归的归并排序。 并且在每一步排序之后都要检查是否和给出的数组相同,如果相同下一次排序之后要输出。 具体插入原创 2017-05-15 21:16:22 · 551 阅读 · 0 评论 -
哈希表的使用-11-散列1 电话聊天狂人
电话聊天狂人题目 11-散列1 电话聊天狂人 (25分)分析 这道题考察的就是哈希表的建立与使用。我整体的思路是这样:先根据输入n建立一个适当大小的哈希表,然后将2*n个电话号码插入到哈希表中,最后遍历哈希表,找出出现次数最多的电话号码。 而散列表的构造,重点就在于如何构造散列函数,如何进行冲突处理。 (1)构造散列函数。 由于电话号码后四位是完全随机的,变化较大,所以可以作为关键原创 2017-05-29 15:12:47 · 591 阅读 · 0 评论 -
图的搜索和最短路径-Saving James Bond
图的搜索-深度优先搜索DFS题目 06-图2 Saving James Bond - Easy Version分析 James从中心岛屿开始跳,这一跳需要进行特殊处理,然后在鳄鱼头上跳的时候,利用dfs进行搜索,一旦可以跳到安全区域就结束搜索。 注意中心岛屿并不是P[0]。代码#include<stdio.h>#include<math.h>#define maxn 101int N原创 2017-05-24 10:40:45 · 420 阅读 · 0 评论 -
结构体排序-10-排序5 PAT Judge (25分)
题目 10-排序5 PAT Judge (25分)分析 这道题我做了好久,刚开始一直都是部分错误。 其实我觉得这道题有两个注意点: (1)需要认真审题,真的必须仔细理解题目的每一句话,特别是排序到底是按照什么规则,输出格式到底是怎样,哪些该输出,哪些不用输出,我刚开始就是这几个部分没有理解清楚。 (2)显然这道题需要用到结构体(或者是类),那结构体如何进行排序呢? ① 一种是重载<原创 2017-05-19 01:17:12 · 1093 阅读 · 0 评论 -
图的基本操作:建立图,DFS,BFS-06-图1 列出连通集
图的遍历方式一般有两种:DFS,BFS 题目 06-图1 列出连通集 (25分)分析 这里考察的是图的基本操作:建立一个图,深度优先遍历(DFS)和广度优先遍历(BFS)。 由于这儿N很小,我就直接用邻接矩阵(二维数组)来存储图。 DFS利用递归,BFS利用队列。我的代码#include<iostream>#include<cstring>#include<queue>usi原创 2017-05-17 11:38:18 · 573 阅读 · 0 评论 -
树的遍历(递归与非递归版本)
树的遍历题目要求要求4个函数分别按照访问顺序打印出结点的内容,格式为一个空格跟着一个字符。#include <stdio.h>#include <stdlib.h>typedef char ElementType;typedef struct TNode *Position;typedef Position BinTree;struct TNode{ ElementType Data原创 2017-09-09 21:17:09 · 1089 阅读 · 0 评论 -
两个堆栈实现队列,两个队列实现堆栈
两个堆栈实现队列分析 堆栈是先进后出,队列是先进先出,用两个堆栈倒腾两次正好把顺序反过来就能实现队列的操作。 一个堆栈用来出队(可以叫stackPop),一个堆栈用来入队(可以叫stackPush)。 要实现先进先出,要把数据从stachPush中倒腾到stackPop中,倒腾的时候,必须保证两点: (1). stackPush往stackPop倒腾的时候,必须一次把stackPush的时原创 2017-06-01 22:31:53 · 4426 阅读 · 0 评论 -
排序算法-09-排序1 排序 (25分)-第二部分
题目 09-排序1 排序 (25分)排序算法-09-排序1 排序 (25分)-第一部分 http://blog.csdn.net/bobo1356/article/details/71749720快速排序基本思想 分而治之的思想。归并排序也是先分解后归并,归并的时候也做了一部分工作。而快速排序,是选取一个基准元素(povit),然后把数组分为两部分,通过交换,使得基准元素的左边都小于原创 2017-05-13 23:52:21 · 502 阅读 · 0 评论 -
排序算法-09-排序1 排序 (25分)-第一部分
题目 09-排序1 排序 (25分)冒泡排序大概的思想 一趟冒泡排序之后,最大的数在最后;第二趟冒泡之后,次大的数在倒数第二位。 其中一个优化措施是 用一个变量flag标识这一趟冒泡中是否有过交换,如果没有的话,说明数组已经有序了。代码#include <stdio.h>#define ElementType long#define maxn 100001ElementType原创 2017-05-12 17:33:42 · 1491 阅读 · 0 评论 -
链表中环的入口结点
题目来源:牛客网-剑指offer 链表中环的入口结点题目要求 一个链表中包含环,请找出该链表的环的入口结点分析 (1)一种比较偷懒的方法就是遍历链表,并直接利用HashMap来保存已经遍历过的结点。一旦发现已经保存过的结点,那么该结点就是环的入口结点。 (2)参考自https://www.nowcoder.com/questionTerminal/253d2c59ec3e4bc68da1原创 2017-06-01 21:06:33 · 301 阅读 · 0 评论 -
10-排序6 Sort with Swap(0, i)
题目 10-排序6 Sort with Swap(0, i) (25分)分析 我刚开始想着直接排序。先试了几个例子,经过总结之后,觉得步骤应该是这样: 看0在不在位置0处(即得到0所在的位置pos0),如果不在,把0与应该在pos0位置处的数字交换,然后重复执行步骤1;如果在则向下执行。看数组是否有序,如果数组无序,把0与第一个无序的数字交换,然后执行步骤1;如果有序则停止。 在上述原创 2017-05-21 20:55:23 · 433 阅读 · 0 评论 -
寻找两个链表的第一个公共结点
题目链接 两个链表的第一个公共结点要求 输入两个链表,找出它们的第一个公共结点。模板/*public class ListNode { int val; ListNode next = null; ListNode(int val) { this.val = val; }}*/public class Solution { pub原创 2017-06-01 20:15:11 · 240 阅读 · 0 评论 -
拓扑排序-图8 How Long Does It Take
题目 08-图8 How Long Does It Take (25分)分析 典型的拓扑排序问题。大致的解法如下: 我的代码#include <stdio.h>#define MAXN 100#define INF 1234567int graph[MAXN][MAXN];int inDegree[MAXN] = {0};int earliest[MAXN];struct Q原创 2017-05-31 17:23:33 · 476 阅读 · 0 评论 -
图的最小生成树问题-公路村村通
题目 08-图7 公路村村通 (30分)分析 典型的最小生成树问题。 prim算法和dijkstra算法长得很像。prim算法核心思想就是让一棵小树长大,采用贪心策略,每次从小树相邻的顶点中收录一个路径最短的顶点,直到这棵树长到最大。最后检查这棵树中的顶点是否完全包含了图中的顶点,如果没有,就说明图不连通,不存在最小生成树。 prim算法求解代码#include <stdio.h>#原创 2017-05-31 14:03:43 · 1105 阅读 · 0 评论 -
2017年5月月赛-暨中南大学暑期集训选拔赛第一场-部分题目
1.1924: 那些年寮里的崽儿们题目 1924: 那些年寮里的崽儿们分析 用Java来做的话,其实这道题可以用一个LinkedHashMap来保存输入的字符串和它出现的次数,因为LinkedHashMap遍历时的顺序就是插入时的顺序,所以正好满足题意。我的代码import java.util.*;public class Main { public static void m原创 2017-05-15 17:28:36 · 478 阅读 · 0 评论 -
逆转链表-pta02-线性结构3 Reversing Linked List
题目链接 题目难点分析 1.链表结点如何逆转 用三个指针new_head、old_head,tmp。之所以要用三个,是因为除了逆转的两个结点外,还需要保存下一个待逆转的结点,不保存的话逆转之后就找不到了。 另外因为不是N个结点全部逆转,而是要一次逆转K个,所以需要保存上一次逆转之后的尾结点LastRear和这一次逆转之后的尾结点rear。需要把lastRear的指针指向当前逆转好的序列的头原创 2017-05-05 18:53:19 · 482 阅读 · 0 评论 -
学习排序算法2--插入排序
/*插入排序 * 思想: 就像整理扑克牌一样,一张一张的拿起来,将刚拿起来的牌插入到合适的位置。 * 具体的方法是,刚拿起来的一张牌和前一张牌比较,比它小就交换,然后往前一次比较,直到它比前一个大 * 这样一张张插入,拿到最后一张插入合适位置后,整副牌就是有序的。 * 时间复杂度: 对于随机排列的长度为N且逐渐不重复的数组 * 最好情况: N-1次比较,0次交换 (本来就是排翻译 2016-05-23 12:42:09 · 734 阅读 · 0 评论 -
学习排序算法1
/*看算法4,第二章内容摘录。*///排序算法类的模板package paixu;public class Example { //排序 public void sort(Comparable[] a){ } //判断v是否小于w protected static boolean less(Comparable v,Comparable w){ return v.co翻译 2016-05-23 12:09:33 · 482 阅读 · 0 评论 -
计算阶乘升级版---pta测试基础题
4-10 阶乘计算升级版 (20分) 本题要求实现一个打印非负整数阶乘的函数。函数接口定义:void Print_Factorial ( const int N );其中N是用户传入的参数,其值不超过1000。如果N是非负整数,则该函数必须在一行中打印出N!的值,否则打印“Invalid input”。裁判测试程序样例:#include void Prin原创 2017-03-25 11:23:08 · 2090 阅读 · 0 评论 -
PTA测试基础题--统计个位数字
本题要求实现一个函数,可统计任一整数中某个位数出现的次数。例如-21252中,2出现了3次,则该函数应该返回3。函数接口定义:int Count_Digit ( const int N, const int D );其中N和D都是用户传入的参数。N的值不超过int的范围;D是[0, 9]区间内的个位数。函数须返回N中D出现的次数。裁判测试程序样例:#inclu原创 2017-03-25 10:28:59 · 6542 阅读 · 0 评论 -
C语言测试一个函数运行时间的模板
//// main.c// Chapter1// C语言测试一个函数运行时间的模板,// clock()函数返回程序开始运行到该函数被调用时所耗费的时间#include #include clock_t start,stop; //clock_t是clock()函数返回的变量类型double duration;int main(int argc, cons原创 2017-03-25 09:10:03 · 4062 阅读 · 1 评论 -
算法复习3--减治法
分治策略变体--减策略和变治策略减治策略减治技术利用一个问题给定实例的解和同样问题较小实例的解之间的某种关系来求解。---递推,递归。可以自底向上迭代实现,也可以自顶向下递归实现。分为三类:减去一个常量减去一个常数因子减去的规模是可变的1.减去常量(1)插入排序要将n个数排序,可先将n-1个数排序,然后将最后一个数插入合适的位置即可。这样就将规模为n的排原创 2016-06-17 23:28:54 · 2480 阅读 · 0 评论 -
算法复习2--分治法
一、分治法的基本策略分治法将一个复杂的问题分成两个或多个相同或相似的子问题,再把子问题分解成更小的子问题,这样一直循环下去,直到最后子问题可以简单的直接求解,原问题的解就是子问题解的合并。分治法所能解决的问题一般具有的特征:(1)一定规模的子问题可直接求解(2)原问题可分解(3)各个子问题相互独立,即子问题之间不包含公共的子问题。(4)子问题的解可合并得到原问题的解。二原创 2016-06-17 23:23:18 · 407 阅读 · 0 评论 -
算法复习1——暴力法
蛮力法基于问题的描述和所涉及的概念、定义直接求解,逐一列举并处理问题所涉及的所有情形,而后得到问题的答案。优点:逻辑清晰,简单,易于实现缺点:效率不高适用于规模比较小的问题基本技术:扫描技术和枚举方法1.排序问题(1)选择排序(2)冒泡排序2.查找问题顺序查找3.字符串匹配问题//蛮力法求解字符串匹配问题//输入:文本W[0..n-1]翻译 2016-06-15 23:46:52 · 2045 阅读 · 0 评论 -
学习排序算法6--快速排序
/*快速排序 *思想: 分治的排序算法,它将一个数组分成两个数组,将两部分独立的排序。 * 先选取一个元素作为切分元素,然后从数组两边向中间扫描,使得左边的元素小于等于切分元素,右边的元素大于等于切分元素。 * 这样递归进行,直到整个数组有序。 * 时间复杂度: O(N㏒N) * 空间复杂度: 需要一个很小的辅助栈 * * */package paixu;impo翻译 2016-06-07 09:15:27 · 772 阅读 · 0 评论 -
学习排序算法5--归并排序
此博客为连载博客需要参考我前面几篇博客代码才可以实现/*归并排序 * 思想: divide and conquer (分治法) * 将一个数组等分成两个更小的数组,将这两个数组排序后,再将它们归并起来将得到一个有序数组 * 具体归并方法就是从两个数组中从小到大放入大数组中 * 时间复杂度: 对于长度为N的任意数组,自顶向下的归并排序需要1/2N㏒N至N㏒N O(翻译 2016-05-26 23:51:07 · 467 阅读 · 0 评论 -
学习排序算法4--希尔排序
此代码需要用到我前面三个博客的部分代码(因为此处将希尔排序和选择排序,插入排序进行了运行时间的比较)http://blog.csdn.net/bobo1356/article/details/51480668http://blog.csdn.net/bobo1356/article/details/51480784http://blog.csdn.net/bobo1356/articl翻译 2016-05-25 17:00:40 · 498 阅读 · 0 评论 -
求自定义类型序列中的中位数
题目要求是:这里写链接内容 本题要求实现一个函数,求N个集合元素A[]的中位数,即序列中第[N/2+1]大的元素。其中集合元素的类型为自定义的ElementType。 我这儿有个疑问,这儿如果N为 偶数,那么中位数是哪一个?因为后面提交之后没有错误提示,我多次尝试提交,正确之后,发现这儿的中位数是,从小到大排列,第[N/2+1]个元素 我本来的代码是直接利用选择排序,之后直接选出中位数:Ele原创 2017-03-25 21:13:27 · 1123 阅读 · 1 评论