数据结构
loreal8
学生
展开
-
图的基本知识总结
图基本概念顶点和边有向图和无向图完全图邻接顶点顶点的度路径路径长度简单路径与回路子图连通图强连通图生成树图的存储结构邻接矩阵优缺点实现邻接表基本概念图是由顶点集合及顶点间的关系组成的一种数据结构:G = (V, E),其中:顶点集合V = {x|x属于某个数据对象集}是有穷非空集合;E = {(x,y)|x,y属于V}或者E = {<x, y>|x,y属于V && Path(x, y)}是顶点间关系的有穷集合,也叫做边的集合。(x, y)表示x到y的一条双向通路,即(x原创 2020-10-05 23:45:31 · 643 阅读 · 0 评论 -
并查集的详细解释与应用场景
并查集并查集原理概念示例并查集实现并查集应用并查集原理概念在一些应用问题中,需要将n个不同的元素划分成一些不相交的集合。开始时,每个元素自成一个单元素集合,然后按一定的规律将归于同一组元素的集合合并。在此过程中要反复用到查询某一个元素归属于那个集合的运算。适合于描述这类问题的抽象数据类型称为并查集(union-findset)。示例比如大学刚开学,一个班有10个新同学,起初他们互相不认识。假设10个同学编号1-10。用数组的编号代表这些同学,同时数组内初始全为-1(置为-1的原理后边解释)。原创 2020-09-17 23:16:31 · 2340 阅读 · 0 评论 -
C++红黑树的实现
红黑树红黑树,是一种二叉搜索树,但在每个结点上增加一个存储位表示结点的颜色,可以是Red或Black。 通过对任何一条从根到叶子的路径上各个结点着色方式的限制,红黑树确保没有一条路径会比其他路径长出2倍,因而是接近平衡的 .红黑树的性质1.每个结点不是红色就是黑色2.根节点是黑色的3.如果一个节点是红色的,则它的两个孩子结点是黑色的4.对于每个结点,从该结点到其所有后代叶结点的简单路径上,均 包含相同数目的黑色结点5.每个叶子结点都是黑色的(此处的叶子结点指的是空结点)红黑树新节点的插入1原创 2020-07-13 13:33:23 · 123 阅读 · 0 评论 -
C++根据层序遍历序列构造二叉树,再层序遍历二叉树
层序构造&层序遍历要用到一个协助队列层序构造假设要构造的二叉树的层序遍历序列存在一个数组里1.只要数组不为空,就先入队数组首元素,并用这个值创建二叉树的root。2.然后进入循环,队列不为空,就拿队头元素,对头再出队。队列为空,结束循环。3.只要数组还有元素,就先给刚刚拿出的对头元素创建左孩子,然后左孩子入队。4.同上,再创建右孩子,右孩子入队。5.结束一次循环。回到2层序遍历与层序构造类似1.树不为空,root先入队2.进入循环,队列不为空,则拿到队头元素,对头出队。队列为原创 2020-07-10 23:27:34 · 6465 阅读 · 3 评论 -
数据结构--二叉树的基本操作实现(链式)
二叉树功能包括:// 通过前序遍历的数组,例如:"ABD##E#H##CF##G##"构建二叉树// 二叉树销毁// 二叉树节点个数// 二叉树叶子节点个数// 二叉树第k层节点个数// 二叉树查找值为x的节点// 二叉树前序遍历// 二叉树中序遍历// 二叉树后序遍历// 层序遍历//判断是否为完全二叉树注意:调用的栈跟队列没写出来,但是注意要把它们的typedef的元...原创 2020-05-08 14:08:28 · 678 阅读 · 0 评论 -
数据结构--树的知识总结
树,二叉树树:1.节点的度:一个节点含有的子树的个数称为该节点的度; 如上图:A的为62.叶节点或终端节点:度为0的节点称为叶节点; 如上图:B、C、H、I…等节点为叶节点3.非终端节点或分支节点:度不为0的节点; 如上图:D、E、F、G…等节点为分支节点4.双亲节点或父节点:若一个节点含有子节点,则这个节点称为其子节点的父节点; 如上图:A是B的父节点5.孩子节点或子节点:一个节点...原创 2020-04-27 16:56:26 · 228 阅读 · 0 评论 -
数据结构--二叉树的三序遍历(前中后)
二叉树的三序遍历前序: node > left > right中序: left > node > right后序: left > right > node前序://获得节点个数int BSize(struct TreeNode* root){ if (root == NULL) return 0; return BSize(root->...原创 2020-04-23 15:32:03 · 163 阅读 · 0 评论 -
数据结构--判断是否是单值二叉树
单值二叉树如果二叉树每个节点都具有相同的值,那么该二叉树就是单值二叉树。bool func(struct TreeNode* root, int k) { if (root == NULL) { return true; } return root->val == k && func(root->left, k) && func(r...原创 2020-04-23 15:02:09 · 195 阅读 · 0 评论 -
数据结构--二叉树的最大深度
二叉树最大深度二叉树的深度为根节点到最远叶子节点的最长路径上的节点数。int maxDepth(struct TreeNode* root) { if (root == NULL) { return 0; } int l = maxDepth(root->left); int r = maxDepth(root->right); //递归的最后加1是算上根节点 re...原创 2020-04-23 15:00:44 · 215 阅读 · 0 评论 -
数据结构--翻转二叉树
翻转二叉树如下图所示:翻转前:翻转后:struct TreeNode* invertTree(struct TreeNode* root) { if (root == NULL) { return; } struct TreeNode* tmp = root->left; root->left = root->right; root->right ...原创 2020-04-23 14:57:52 · 224 阅读 · 0 评论 -
数据结构--检查两个树是否相同
判断两树是否相同bool isSameTree(struct TreeNode* p, struct TreeNode* q) { if (p == NULL && q == NULL) { return true; } if (p == NULL || q == NULL) { return false; } return p->val == q->...原创 2020-04-23 14:54:46 · 438 阅读 · 0 评论 -
数据结构--对称二叉树
对称二叉树给定一个二叉树,检查它是否是镜像对称的。如下图的二叉树就是对称的:bool func(struct TreeNode* p, struct TreeNode* q) { if (p == NULL && q == NULL) { return true; } if (p == NULL || q == NULL) { return false; }...原创 2020-04-23 14:53:15 · 276 阅读 · 0 评论 -
数据结构--判断一个树是不是另一个树的子树
另一个树的子树给定两个非空二叉树 s 和 t,检验 s 中是否包含和 t 具有相同结构和节点值的子树。s 的一个子树包括 s 的一个节点和这个节点的所有子孙。s 也可以看做它自身的一棵子树。bool func(struct TreeNode* p, struct TreeNode* q) { //两树同时结束代表前边的节点全部相同 if (p == NULL && q ==...原创 2020-04-23 14:51:11 · 331 阅读 · 0 评论 -
数据结构--平衡二叉树
平衡二叉树给定一个二叉树,判断它是否是高度平衡的二叉树。平衡二叉树定义:一个二叉树每个节点 的左右两个子树的高度差的绝对值不超过1。例如:给定二叉树 [3,9,20,null,null,15,7]int get(struct TreeNode* root) { if (root == NULL) { return 0; } int l = get(root->left)...原创 2020-04-23 13:36:13 · 101 阅读 · 0 评论 -
数据结构--根据输入字符串建立二叉树并遍历
二叉树建立并遍历编一个程序,读入用户输入的一串先序遍历字符串,根据此字符串建立一个二叉树(以指针方式存储)。 例如如下的先序遍历字符串: ABC##DE#G##F### 其中“#”表示的是空格,空格字符代表空树。建立起此二叉树以后,再对二叉树进行中序遍历,输出遍历结果。#include<stdio.h>#include<stdlib.h>typedef struct...原创 2020-04-23 13:26:44 · 6367 阅读 · 0 评论 -
排序--堆排序
数组的堆排序#include<stdio.h>//对数组进行堆排序//数组要升序,则要建大堆//数组要降序,建小堆typedef int datatype;void Swap(datatype* array, int left, int right) { int tmp = array[left]; array[left] = array[right]; array[...原创 2020-04-20 18:00:22 · 109 阅读 · 0 评论 -
数据结构--堆的基本操作实现&获得数组中前k个最值
堆堆是一个完全二叉树;小堆的子节点总是大于父节点的,大堆相反;堆一般是采用顺序结构实现;#include<stdio.h>#include<stdlib.h>#include<string.h>#include<assert.h>typedef int datatype;typedef struct Heap{ datatype...原创 2020-04-20 17:57:10 · 178 阅读 · 0 评论 -
C语言--用队列实现栈
用队列实现栈把数据从队头出来,再插入到队尾,最后一个不插入,直接出栈就实现了出栈操作。取栈顶元素就是获取队尾元素。其余操作入栈,判空,销毁类似于队列操作。可以用一个队列实现栈,也可以用俩队列,我用的一个队列。typedef int type;typedef struct Node { type data; struct Node* next;}Node;typedef stru...原创 2020-04-13 17:15:06 · 486 阅读 · 1 评论 -
C语言--用栈实现队列
用栈实现队列要想用栈实现队列功能,则至少需要2个栈。存储数据的栈按照栈的后进先出原则依次进入另一个栈,再按照栈的后进先出原则出栈就实现了队列的先进先出,相当于负负得正的感觉。typedef int type;typedef struct Stack { type* array; size_t size; size_t capacity;}Stack;//栈初始化void Sta...原创 2020-04-13 17:06:09 · 496 阅读 · 0 评论 -
C语言--括号匹配
括号匹配给定一个只包括 ‘(’,’)’,’{’,’}’,’[’,’]’ 的字符串,判断字符串是否有效。1.有效字符串需满足: 左括号必须用相同类型的右括号闭合。2. 左括号必须以正确的顺序闭合。注意空字符串可被认为是有效字符串。示例1:输入: "()"输出: true示例2:输入: "()[]{}"输出: true示例3:输入: "(]"输出: false示例4:...原创 2020-04-13 17:17:47 · 879 阅读 · 0 评论 -
C语言--带头双向循环链表的基本操作实现
带头双向循环链表链表为空的条件:header->next == header#include<stdio.h>#include<stdlib.h>typedef int LTDataType;typedef struct ListNode{ LTDataType data; struct ListNode* next; struct ListNo...原创 2020-04-10 21:07:01 · 294 阅读 · 0 评论 -
C语言--删除链表中重复的节点
删除链表中重复的节点在一个排序的链表中,存在重复的结点,请删除该链表中重复的结点,重复的结点不保留,返回链表头指针.示例: 输入:1>2>3>3>4>4>5 输出:1>2>5ListNode* deleteDuplication(ListNode* pHead) { if(pHead == NULL || pHea...原创 2020-04-10 19:15:14 · 1654 阅读 · 0 评论 -
C语言--对链表进行插入排序
对链表进行插入排序示例1:输入: 4->2->1->3输出: 1->2->3->4示例2:输入: -1->5->3->4->0输出: -1->0->3->4->5struct ListNode* insertionSortList(struct ListNode* head){ struc...原创 2020-04-09 17:03:20 · 1141 阅读 · 0 评论 -
C语言--循环队列实现
循环队列使用一个size标志来表示当前队列有多少个元素当 size = 0 //表示空队列当 size = 队列长度 //表示满队列typedef struct { int front; //第一个元素位置 int rear; //最后一个元素位置 int size; //当前元素个数 int k; //容量 int* ar...原创 2020-04-09 15:44:34 · 191 阅读 · 0 评论 -
C语言--栈的基本操作实现
栈#include<stdio.h>#include<stdlib.h>typedef int type;typedef struct Stack { type* array; size_t size; size_t capacity;}Stack;//栈初始化void StackInit(Stack* sl, size_t n) { sl->...原创 2020-04-07 22:30:07 · 618 阅读 · 1 评论 -
C语言--队列的基本操作实现
队列#include<stdio.h>#include<stdlib.h>typedef int type;typedef struct Node { type data; struct Node* next;}Node;typedef struct Queue { struct Node* front; struct Node* rear;}Queu...原创 2020-04-07 20:39:33 · 529 阅读 · 2 评论 -
C语言--单链表的所有操作实现
单链表的所有操作实现// 动态申请一个节点SListNode* BuySListNode(SLTDateType x)//链表初始化void SListInit(Head* plist)// 单链表打印void SListPrint(Head* plist)// 单链表尾插void SListPushBack(Head* pplist, SLTDateType x)// ...原创 2020-04-02 17:31:21 · 285 阅读 · 0 评论 -
C语言--翻转链表
翻转链表例如:输入: 1->2->3->4->5->NULL输出: 5->4->3->2->1->NULLstruct ListNode* reverseList(struct ListNode* head) { struct ListNode* new, * cur, * next; cur = head; new = ...原创 2020-04-02 14:52:04 · 150 阅读 · 0 评论 -
C语言--移除链表元素
移除链表元素删除链表中等于给定值 val 的所有节点。例如:输入: 1->2->6->3->4->5->6, val = 6输出: 1->2->3->4->5struct ListNode* removeElements(struct ListNode* head, int val) { struct ListNode...原创 2020-04-02 14:35:15 · 733 阅读 · 0 评论 -
C语言--关于快慢指针的例题
关于快慢指针的例题1:给定一个带有头结点 head 的非空单链表,返回链表的中间结点。 如果有两个中间结点,则返回第二个中间结点。示例1:输入:[1,2,3,4,5]输出:此列表中的结点 3 (序列化形式:[3,4,5])返回的结点值为 3 。 (测评系统对该结点序列化表述是 [3,4,5])。注意,我们返回一个 ListNode 类型的对象 ans,这样:ans.val = 3, a...原创 2020-04-02 14:28:10 · 412 阅读 · 0 评论 -
C语言--原地删除数组重复项
原地删除数组重复项给定一个排序数组,你需要在 原地 删除重复出现的元素,使得每个元素只出现一次,返回移除后数组的新长度。不要使用额外的数组空间,你必须在 原地 修改输入数组 并在使用 O(1) 额外空间的条件下完成。示例1:给定数组 nums = [1,1,2]函数应该返回新的长度 2, 并且原数组 nums 的前两个元素被修改为 1, 2你不需要考虑数组中超出新长度后面的元素示例...原创 2020-03-30 16:52:01 · 1279 阅读 · 0 评论 -
C语言--数组形式的整数加法
数组形式的整数加法对于非负整数 X 而言,X 的数组形式是每位数字按从左到右的顺序形成的数组。例如,如果 X = 1231,那么其数组形式为 [1,2,3,1]。给定非负整数 X 的数组形式 A,返回整数 X+K 的数组形式。示例1:输入:A = [1,2,0,0], K = 34输出:[1,2,3,4]解释:1200 + 34 = 1234示例2:输入:A = [2,7,4],...原创 2020-03-30 15:33:38 · 1824 阅读 · 0 评论 -
C语言--旋转数组
旋转数组给定一个数组,将数组中的元素向右移动 k 个位置,其中 k 是非负数。void reverse(int* nums,int left,int right){ while(left < right){ int tmp = nums[left]; nums[left] = nums[right]; nums[right] = tmp; left++; right...原创 2020-03-29 18:15:35 · 1375 阅读 · 0 评论 -
数据结构--返回环形链表的入环节点C
返回环形链表的入环节点给定一个链表,返回链表开始入环的第一个节点。 如果链表无环,则返回 null。示例:输入:head = [3,2,0,-4], pos = 1输出:tail connects to node index 1解释:链表中有一个环,其尾部连接到第二个节点struct ListNode* hasCycle(struct ListNode* head) { if (h...原创 2020-04-19 18:08:38 · 188 阅读 · 0 评论 -
数据结构--判断链表中是否有环C
判断链表中是否有环给定一个链表,判断链表中是否有环。示例:输入:head = [3,2,0,-4], pos = 1输出:true解释:链表中有一个环,其尾部连接到第二个节点。bool hasCycle(struct ListNode* head) { struct ListNode* fast, * slow; fast = slow = head; while (fast ...原创 2020-04-19 18:05:02 · 306 阅读 · 0 评论 -
数据结构--两个链表相交的第一个节点C
相交链表找到两个单链表相交的起始节点。例如:返回c1节点的值。struct ListNode* getIntersectionNode(struct ListNode* headA, struct ListNode* headB) { int s = 0; int lenA = 0; int lenB = 0; struct ListNode* A, * B; A = head...原创 2020-04-19 18:01:04 · 169 阅读 · 0 评论 -
数据结构--链表的回文结构C
链表的回文结构判断一个链表否为回文结构。示例:1->2->2->1返回:truebool chkPalindrome(ListNode* A) { // write code here struct ListNode* pre, * next, * cur, * fast, * slow; if (A == NULL) { return NULL; } ...原创 2020-04-19 17:52:41 · 173 阅读 · 0 评论 -
数据结构--链表分割C
链表分割以给定值x为基准将链表分割成两部分,所有小于x的结点排在大于或等于x的结点之前。ListNode* partition(ListNode* pHead, int x) { // write code here if (pHead == NULL) { return NULL; } struct ListNode* L1, * L2, * R1, * R2, * cur; ...原创 2020-04-19 17:47:06 · 174 阅读 · 0 评论 -
数据结构--合并两个有序链表C
合并两个有序链表将两个升序链表合并为一个新的升序链表并返回。新链表是通过拼接给定的两个链表的所有节点组成的。示例:输入:1->2->4, 1->3->4输出:1->1->2->3->4->4struct ListNode* mergeTwoLists(struct ListNode* l1, struct ListNode* l2) ...原创 2020-04-19 17:44:56 · 504 阅读 · 0 评论