数据结构和算法
自用笔记
HardyDragon_CC
谦虚使人进步
展开
-
链表13题
83 删除排序链表中重复元素/** * Definition for singly-linked list. * public class ListNode { * int val; * ListNode next; * ListNode() {} * ListNode(int val) { this.val = val; } * ListNode(int val, ListNode next) { this.val = val; this.next原创 2021-05-19 15:01:09 · 185 阅读 · 0 评论 -
java学习笔记-二叉树的遍历
二叉树的遍历前中后序遍历,层序遍历,广度优先,深度优先……递归方式、迭代方式实现……前序遍历-迭代实现利用栈先进后出的特点,对每一个结点进行根左右顺序的访问。栈对每个结点的操作是,将要操作的结点压栈,然后弹出时检查该结点是否有左右子结点,按照先右后左的顺序将子结点压栈,这样弹出的顺序就是根左右,右子结点在左子结点在前入栈。PreOrder.javaimport java.util.Stack;/** * @Description: 根左右顺序遍历二叉树 * @author: Hardy原创 2021-05-07 10:38:36 · 116 阅读 · 0 评论 -
hdu 1312 C++
hdu 1312hdu 1312 题目BFSoutputDFSoutputhdu 1312 题目• 一个长方形的房间,铺着方砖,每块砖是 #或黑点. 。• 一个人站在黑砖上,可以按上、下、左、右方向移动到相邻的砖。• 他不能在#上移动,他只能在黑砖上移动。• 起点是@,要求:遍历所有黑点。BFSBFS 使用队列辅助实现;节点元素包含了位置的x,y。将元素进队时将元素标记为已经访问,下次搜索时跳过。返回的是可以走的位置数目。//ECUST luoyongjun#include<原创 2021-10-23 19:39:27 · 902 阅读 · 0 评论 -
二叉树算法题
144 二叉树的前序遍历递归 时间快,占用空间多/** * Definition for a binary tree node. * public class TreeNode { * int val; * TreeNode left; * TreeNode right; * TreeNode() {} * TreeNode(int val) { this.val = val; } * TreeNode(int val, TreeNode原创 2021-05-23 14:09:49 · 177 阅读 · 0 评论 -
Java学习笔记-LinkedList 二叉树队列
将二叉树结点放进队列方便层序遍历等操作TreeNode.java/** * @Description: This is BinaryTreeNode * @author: HardyDragon * @date: 2021/4/23 10:52 */public class TreeNode { int val; TreeNode left; TreeNode right; TreeNode() { } TreeNode(int val)原创 2021-04-23 11:56:59 · 322 阅读 · 0 评论 -
Java 递归实现经典欧几里得算法 找到两个非负整数的最大公约数
Java 递归实现经典欧几里得算法 找到两个非负整数的最大公约数早在2300年前,就出现了算法。欧几里得算法目的是找到两个数的最大公约数。思路:计算两个非负整数 p 和 q 的最大公约数:如果 q 是 0,那么最大公约数就是另一个数 p。如果不是,那么 p 和 q 的最大公约数就是 q 和 p % q ( p 对 q 取余数)的最大公约数。public int gcpp(int p, int q) { if (q == 0) return p; int r = p % q;原创 2021-04-18 11:57:53 · 245 阅读 · 0 评论 -
将两个非递增的有序链表合并为一个非递减的有序链表
将两个非递增的有序链表合并为一个非递减的有序链表将两个非递增的有序链表合并为一个非递减的有序链表。要求结果链表仍使用原来两个链表的存储空间, 不另外占用其它的存储空间。表中允许有重复的数据。操作的名称和参数使用下列结构:La和Lb表示将要合并的链表,合并后的新表使用头指针Lc指向。void MergeList(LinkList& La, LinkList& Lb, LinkList& Lc)将两个递减链表合并为一个递增链表;使用递归进行合并,迭代方式反转。空间复杂度O(1)原创 2021-04-06 21:08:23 · 1606 阅读 · 0 评论 -
根据序列构建二叉树 图解 文字详细解释
题目:已知一棵二叉树,其先序序列为:ABDEGMNCFH,中序序列为:DBMGNEACHF,请画出这棵二叉树(给出过程),并给出其后序序列。先:ABDEGMNCFH 中:DBMGNEACHF1. 根据先序遍历知道 A 是根节点,由中序遍历知道 DBMGNE 是 A 的左子树,CHF 是A 的右子树。2. 由 先序遍历 BDEGMN 知道 B是根节点,由中序遍历 DBMGNE 知道 D是B的左子树, MGNE是B的右子树。3. 由 先序遍历 EGMN 知道 E是根节点,由中序遍历 MGNE 知道原创 2021-03-27 17:55:43 · 2120 阅读 · 2 评论 -
设计判断二叉树是否为二叉排序树的算法
设计判断二叉树是否为二叉排序树的算法bool isSortTree(TreeNode *Tree) 递归判断二叉树是否为二叉排序树,1.1 叶子结点返回true,即N0结点1.2 只有左右子树的其中一个,N1结点1.3 有左右子树的,N2结点二叉排序树性质:中序遍历二叉树 得到的序列值是递增的。// 1、设计判断二叉树是否为二叉排序树的算法。(8分)#include "stdio.h"#include "stdbool.h"#include "stdlib.h"typedef st原创 2021-03-25 18:35:39 · 4772 阅读 · 2 评论 -
试编写一个函数,要在一棵树Tree中,找出最大值。函数原型如下 bool fnGetMax( struct TreeNode *Tree, int *max );
遍历树即可原创 2021-03-24 17:05:08 · 136 阅读 · 0 评论 -
AOE网关键路径求解例题
AOE网关键路径求解例题 三道首先明确顶点是事件,边是活动。123解题技巧:先求Ve 从前往后推,取活动之和最大的 作为顶点(事件)最早发生时间;求Vl 通过Ve知道最后汇点的最晚发生时间(和汇点的最早发生时间相等),从后往前推,用顶点和活动做差取结果最小 作为顶点最晚发生时间。这里典型的例子就是V4,应该用V6的最晚发生时间减去a9和a6而不是直接减去a7,因为V6-a7 = 10 > 7 ,而我们要的是所有可能中最小的值,和求Ve时候相反。接着求e活动的最早发生时原创 2021-03-04 23:43:48 · 13366 阅读 · 3 评论 -
假定一个关键字序列为{32,75,63,48,94,25,36,18},哈希地址空间为[0…10],采用哈希函数H(key)=key MOD 11,用二次探测再散列法处理冲突,试给出对应的哈希表(给出
假定一个关键字序列为{32,75,63,48,94,25,36,18},哈希地址空间为[0…10],采用哈希函数H(key)=key MOD 11,用二次探测再散列法处理冲突,试给出对应的哈希表(给出求解过程),并计算在等概率情况下查找成功时的平均查找长度...原创 2021-02-17 12:45:35 · 4796 阅读 · 0 评论 -
ds填空题2021/2/16
2021/2/16在一棵二叉树中,假定度为2的结点个数为5个,度为1的结点个数为6个,则叶子结点数为 6 个。需要知道二叉树 叶子结点数和度为2结点数 的性质:二叉树的叶子结点数永远比度为2的结点数多 1 个。设森林F中有3棵树,第1、2、3棵树的结点个数分别为n1、n2、n3,当把森林F转换成一棵二叉树后,其根结点的右子树中有 ____n2+n3 个结点。需要了解由树转为二叉树,以森林转换二叉树的过程,兄弟结点作为结点的右子树。将含有64个结点的完全二叉树从根结点开始顺序编号原创 2021-02-16 13:22:35 · 569 阅读 · 3 评论 -
序列A={12, 70, 33, 65, 24, 56}给出对应于序列A的大顶堆HA(以线性数组表示)
题目序列A={12, 70, 33, 65, 24, 56}给出对应于序列A的大顶堆HA(以线性数组表示)_________。原创 2021-02-07 21:47:20 · 390 阅读 · 0 评论 -
C循环链表代码实现,主函数调用
C循环单链表代码实现,主函数调用引入了一个表头结点,同时循环单链表有表长以及表尾指针属性。表头结点不存放值,只存放指向第一个元素的指针域;同时表尾指针的next指向表头结点;即从链表任意位置出发都可以遍历完所有链表元素;#include <stdio.h>#include <stdlib.h>typedef int ListItem; // 表元素类型typedef ListItem *addr; // 表元素指针类型#define eq(A, B) (A原创 2021-02-06 13:47:11 · 568 阅读 · 0 评论 -
C间接寻址法实现表代码,主函数调用
C间接寻址法实现表代码,主函数调用结合了数组方便存取的优点以及指针实现表方便修改表元素的优点;将原来数组存储元素的值改为存储指向元素的指针,修改元素只需要修改指针指向的值即可,不需要在表内移动其他元素。#include <stdio.h>#include <stdlib.h> // malloctypedef int ListItem; // 表元素类型typedef ListItem *addr; // 表元素指针类型#define eq(A,原创 2021-02-03 14:55:21 · 247 阅读 · 0 评论 -
C递归实现合并两个有序单链表
C递归实现合并两个有序单链表发现力扣上有简洁的解法https://leetcode-cn.com/problems/merge-two-sorted-lists/comments//** * Definition for singly-linked list. * struct ListNode { * int val; * struct ListNode *next; * }; */struct ListNode* mergeTwoLists(struct List原创 2021-02-02 21:20:01 · 215 阅读 · 0 评论 -
C指针实现单链表,主函数调用
C指针实现单链表,主函数调用使用数组或者指针简单实现的表都有其不同的优缺点,例如数组的比较方便查询,不方便修改,指针的比较方便修改但不方便查询,同时需要额外空间存放指针……之后会有一种 间接寻址方法实现表 结合了以上两种方式的优点。#include <stdio.h>#include <stdlib.h>typedef int ListItem; // 表元素类型typedef ListItem *addr; // 表元素指针类型#define eq(A,原创 2021-02-02 14:26:02 · 1448 阅读 · 0 评论 -
C数组实现表,代码函数及主函数调用
C数组实现表,代码函数及主函数调用重点:位置和索引不用,位置比索引值多1;例如,表位置1 => 表的索引0;或者可以理解为位置是常人思维,索引是程序员思维;#include <stdio.h>#include <stdlib.h> // malloctypedef int ListItem; // 表元素类型typedef ListItem *addr; // 表元素指针类型#define eq(A, B) (A == B) // 元素相等原创 2021-02-01 14:33:28 · 264 阅读 · 2 评论 -
C描述数据结构
C描述数据结构1.指针的定义使用以及取地址符&使用#include <stdio.h>int main(int argc, char const *argv[]){ int *point = 0; int num = 10; point = # printf("*point value = %d.\n",*point); return 0;}result:*point value = 10.2.函数定义调用以原创 2021-01-24 14:58:55 · 122 阅读 · 0 评论 -
将两个非递增的有序链表合并为一个非递减的有序链表。要求结果链表仍使用原来两个链表的存储空间, 不另外占用其它的存储空间。表中允许有重复的数据
将两个非递增的有序链表合并为一个非递减的有序链表。要求结果链表仍使用原来两个链表的存储空间, 不另外占用其它的存储空间。表中允许有重复的数据操作的名称和参数使用下列结构:La和Lb表示将要合并的链表,合并后的新表使用头指针Lc指向。void MergeList(LinkList& La, LinkList& Lb, LinkList& Lc)网上查到的大部分是两个非递减(即递增)的有序链表,书上的也是非递减链表合并成非递减(递增)链表,而题目要求的是非递增(即递减)的有序链表原创 2020-12-25 17:35:27 · 3110 阅读 · 2 评论 -
已知一个图的顶点集V和边集E分别为:V={1,2,3,4,5,6,7}; E=... 用克鲁斯卡尔算法(Kruskal)得到最小生成树,试写出在最小生成树中依次得到的各条边。
已知一个图的顶点集V和边集E分别为:V={1,2,3,4,5,6,7}; E={(1,2)3,(1,3)5,(1,4)8,(2,5)10,(2,3)6,(3,4)15,(3,5)12,(3,6)9,(4,6)4,(4,7)20,(5,6)18,(6,7)25};用克鲁斯卡尔算法(Kruskal)得到最小生成树,试写出在最小生成树中依次得到的各条边。原创 2020-12-20 17:14:39 · 22240 阅读 · 3 评论 -
试编写一个函数,要在一棵树Tree中,找出最大值。函数原型如下: bool fnGetMax( struct TreeNode *Tree, int *max );
(12分)假设二叉树采用左右孩子指针存储结构,即其结点数据类型描述为:struct TreeNode{ int data;//数据域 struct TreeNode *left, *right;//指向其左右孩子结点};试编写一个函数,要在一棵树Tree中,找出最大值。函数原型如下:bool fnGetMax( struct TreeNode *Tree, int *max );//找到最大值则返回true,否则返回false;原创 2020-12-03 23:29:37 · 299 阅读 · 0 评论 -
删除顺序表前i个元素。 已知顺序表的数据结构如下:
1、(8分)删除顺序表前i个元素。已知顺序表的数据结构如下:#define MaxSize 100 typedef struct { int data[MaxSize]; int last; } SeqList;使用如下函数原型:bool fnDelete( SeqList *L, int i );//成功删除则返回true,否则返回false原创 2020-12-03 21:56:05 · 1392 阅读 · 0 评论 -
用序列(46,68,45,139,70,58,101,10,88,94)建立一个二叉排序树,画出该树,并求在等概率情况下查找成功的平均查找长度
用序列(46,68,45,139,70,58,101,10,88,94)建立一个二叉排序树,画出该树,并求在等概率情况下查找成功的平均查找长度二叉排序树:二叉排序树要么是空二叉树,要么具有如下特点:二叉排序树中,如果其根结点有左子树,那么左子树上所有结点的值都小于根结点的值;二叉排序树中,如果其根结点有右子树,那么右子树上所有结点的值都大小根结点的值;二叉排序树的左右子树也要求都是二叉排序树;推荐观看视频:https://www.bilibili.com/video/BV1nJ411V7b原创 2020-12-02 23:05:39 · 10437 阅读 · 3 评论 -
将一个4×3的二维数组a行和列互换,存到另一个3×4的二维数组b中,并将两个数组的数据输出
将一个4×3的二维数组a行和列互换,存到另一个3×4的二维数组b中,并将两个数组的数据输出#include <stdio.h>void printArr(int a[], int length){ int i; for (i = 0; i < length; i++) { printf("%d ", a[i]); } puts("\n");}// 将一个4×3的二维数组a行和列互换,存到另一个3×4的二维数组b中,并将两个数原创 2020-12-01 00:10:49 · 1398 阅读 · 0 评论 -
以下程序完成对一维数组Array进行冒泡排序(从大到小),请填空。
**注意**:是从大到小排序,交换的顺序需要注意,当前项小于后项时就交换,把大的放到前面。**冒泡排序:**外循环:数组长度 - 1内循环:数组长度 - 第几轮的外循环;当外循环初值为0时,需要再-1,因为下标为0时也是一轮排序,而 数组长度- 0起不到效果,需要数组长度 - 0 - 1原创 2020-11-30 23:56:19 · 1150 阅读 · 0 评论 -
下面程序段的功能是实现一趟快速排序,请在下划线处填上正确的语句
## 下面程序段的功能是实现一趟快速排序,请在下划线处填上正确的语句其中的函数参数s对应low指针,t对应high指针。具体代码解析查看这个视频:[https://www.bilibili.com/video/BV1nJ411V7bd?p=164](https://www.bilibili.com/video/BV1nJ411V7bd?p=164)答案出处:[https://www.nowcoder.com/questionTerminal/0c7fcaa6954741fd8349b9ea1ff6原创 2020-11-30 21:28:49 · 2924 阅读 · 2 评论 -
C语言实现冒泡排序 在主函数调用
C语言实现冒泡排序 在主函数调用实现冒泡排序的方式很多种,还有各种优化版本,冒泡的方向不同,这里是以从小到大排序为例,对C语言的数组进行排序,有将数组换做指针的写法,但是冒泡排序的本质都是相同的,其时间复杂度都是O(N方),因为其最重要的就是双重循环比较交换。原创 2020-11-17 15:58:28 · 5679 阅读 · 0 评论