数据结构
文章平均质量分 71
ych9527
这个作者很懒,什么都没留下…
展开
-
二叉搜索树
文章目录1.二叉搜索树是什么2.二叉搜索树的实现2.1二叉搜索树的插入2.2 二叉搜索树的查找2.3二叉搜索树的删除3.二叉搜索树的应用4.实现代码4.1k的搜索模型4.2KV模型1.二叉搜索树是什么二叉搜索树又称二叉排序树,它或者是一棵空树,或者是具有以下性质的二叉树:若它的左子树不为空,则左子树上所有节点的值都小于根节点的值若它的右子树不为空,则右子树上所有节点的值都大于根节点的值它的左右子树也分别为二叉搜索树2.二叉搜索树的实现2.1二叉搜索树的插入1.如果为空,则直接插入2.如果原创 2021-05-10 21:19:49 · 407 阅读 · 6 评论 -
常见二叉树题目集合
文章目录1.对称的二叉树2.平衡二叉树1.对称的二叉树请实现一个函数,用来判断一棵二叉树是不是对称的。如果一棵二叉树和它的镜像一样,那么它是对称的。题目链接class Solution {public: bool Judge(TreeNode *left,TreeNode *right) { if(left==NULL&&right==NULL) return true; if(left==NULL|原创 2021-04-23 17:06:14 · 613 阅读 · 0 评论 -
归并排序
文章目录1.实现思想1.实现思想原创 2021-01-31 16:03:10 · 226 阅读 · 0 评论 -
平衡二叉树
文章目录1.题目2.解题分析2.1常规解法2.2优化解法1.题目给定一个二叉树,判断它是否是高度平衡的二叉树。本题中,一棵高度平衡二叉树定义为:一个二叉树每个节点 的左右两个子树的高度差的绝对值不超过 1 。题目链接2.解题分析2.1常规解法分别求出左右子树的高度,再判断左右子树的高度差是否超过1实现代码int Hight(struct TreeNode *root){ if(root==NULL) return 0; //求该节点的左右子树高度 int原创 2021-01-19 22:15:05 · 193 阅读 · 0 评论 -
编一个程序,读入用户输入的一串先序遍历字符串,根据此字符串建立一个二叉树(以指针方式存储
文章目录1.题目2.解题分析3.代码即图解3.1解题代码3.2图解1.题目编一个程序,读入用户输入的一串先序遍历字符串,根据此字符串建立一个二叉树(以指针方式存储)。例如如下的先序遍历字符串: ABC##DE#G##F### 其中“#”表示的是空格,空格字符代表空树。建立起此二叉树以后,再对二叉树进行中序遍历,输出遍历结果。题目链接2.解题分析此题比较简单,就是通过递归的方式建树和遍历输出即可,这次是分享一个技巧,可以更好理解递归的过程;3.代码即图解3.1解题代码#include <原创 2021-01-19 16:22:46 · 3845 阅读 · 0 评论 -
快速排序的三种方法
文章目录1.hoare法2.挖坑法3.前后指针法1.hoare法1.给定一个基准值2.待划分的区间从后往前寻找比基准值小的值3.待划分区间从前往后寻找比基准值大的值4.交换2.3步找到的数据,再循环执行2.3步5.2和3的查找位置如果相遇则停止循环,相遇位置的值和基准值进行交换特别注意: 第二步和第三步的顺序不能够颠倒,因为当进行了一次交换之后,begin对应的值是小于基准值的,而end对应的值是大于基准值的,当没有满足条件的时候,相遇位置在end处会导致将比基准值大的数据换到前面去;实原创 2021-01-09 15:23:49 · 9626 阅读 · 0 评论 -
插入排序、希尔排序、选择排序、计数排序
文章目录1.插入排序1.1实现1.2特性2.希尔排序1.插入排序1.1实现下面都将以升序为例实现代码:void InsertSort(int *arr, int size)//插入排序{ for (int i = 0; i < size - 1; i++)//升序 { int end = i;//有序数组的最后一个元素下标 int key = arr[end + 1];//无序数组的第一个元素 while (end >= 0 && arr[end]&原创 2021-01-08 10:36:40 · 596 阅读 · 0 评论 -
二叉树知识点集合
文章目录1.树2.二叉树2.1特殊二叉树2.2二叉树的存储结构2.2.1顺序存储2.2.2链式存储2.3存储结构的实现2.3.1顺序结构的实现1.树树是一种非线性的数据结构,由N个节点组合而成的具有层次关系的集合,因为形似一颗倒挂起来的树而获此名;下图中介绍了一些树的基本概念;2.二叉树二叉树为树的一种形态,即每个节点最多两棵子,二叉树的子节点是有左右顺序的,不能颠倒;2.1特殊二叉树2.2二叉树的存储结构2.2.1顺序存储顺序存储采用数组来存储,这种存储方式适用于完全二叉树,因为不会原创 2021-01-07 11:39:11 · 407 阅读 · 0 评论 -
二叉树链式结构的实现
文章目录1.变量的声明2.前序构建二叉树3.二叉树的销毁4.二叉树节点和叶子节点的个数4.1节点的个数4.2 叶子节点的个数5.第K层节点的个数6.二叉树的查找7.二叉树的前序遍历8.二叉树的中序遍历9.二叉树的后序遍历10.层序遍历11.判断是否为完全二叉树1.变量的声明在头文件中声明我们需要实现的函数接口和结构体;#ifndef _BINART_H_#define _BINART_H_#include <stdio.h>#include <windows.h>#i原创 2021-01-07 11:38:23 · 770 阅读 · 0 评论 -
栈和队列的模拟实现
1.栈的模拟实现1.1变量和函数接口声明#ifndef _STACK_H_#define _STACK_H_#include <windows.h>#include <stdio.h>#include <assert.h>typedef int STDataType;typedef struct Stack{ STDataType *arr; int _top; int _capacite;}stack;void StackInit(原创 2021-01-07 11:36:00 · 350 阅读 · 0 评论 -
二叉树的前中后序遍历
文章目录1.题目2.前序解法2.1获得元素个数2.2填入数据2.3整体代码3.中序4.后序1.题目给你二叉树的根节点 root ,返回它节点值的 前序,中序,后序 遍历。前序题目链接中序题目链接后序题目链接这三种遍历的思想是一样的,只不过是前后顺序的差别而已,下面将以前序为例进行一下介绍,其余的会给出代码;2.前序解法2.1获得元素个数int GetSize(struct TreeNode* root)//获得元素的个数 { if(root==NULL) retur原创 2021-01-02 19:45:15 · 410 阅读 · 0 评论 -
顺序表和链表的区别和联系
文章目录1.线性表2.顺序表3.链表1.线性表在介绍顺序表和链表之前,先介绍一下线性表;线性表是N个具有相同特性的数据元素的有限序列。线性表是一种常见的数据结构,常见的有顺序表,链表,栈,队列,字符串等等…线性表顾名思义是一种连续的直线结构,但是这种线性结构只是在逻辑上。在物理结构上不一定是线性结构。在物理存储上通常以数组和链式结构进行存储;2.顺序表顺序表是用一段物理地址连续的存储单元,依次进行元素存储的线性结构,通常用数组存储;即顺序表在本质上面就是数组;顺序表可以分为两种:一种为使用原创 2020-12-31 14:35:17 · 3194 阅读 · 0 评论 -
双向循环链表的增删查减
文章目录1.链表头的初始化2.节点的创建3.插入4.查找5.删除6.尾插7.头插8.尾删9.头删10.打印10.清空和销毁1.链表头的初始化头的初始化有两种方式,要么传二级指针,要么开辟好空间的节点返回地址;ListNode* ListInit(ListNode *pphead)//初始化{ /*assert(pphead); *pphead = (ListNode *)malloc(sizeof(ListNode)); assert(*pphead); (*pphead)->原创 2020-12-31 10:25:05 · 476 阅读 · 0 评论 -
给定一个单链表,请设定一个函数,将链表的奇数位节点和偶数位节点分别放在一起,重排后输出。 注意是节点的编号而非节点的数值。
文章目录1.题目和原题链接2.解题思路3.代码1.题目和原题链接题目链接2.解题思路1.当链表为空或者只有一个节点时直接返回2.除上述情况外,再分类讨论,如下图所示3.代码ListNode* oddEvenList(ListNode* head) { if(head==NULL||head->next==NULL)//0,1,2个节点直接返回 return head; ListNode* odd=head;原创 2020-12-30 16:30:21 · 1615 阅读 · 1 评论 -
二叉树顺序结构的实现
文章目录1.堆的构建过程1.1堆的向下调整算法1.2堆的构建1.堆的构建过程首先来介绍一下堆的概念:1.堆中的某个节点的值总是不大于或者不小于父节点的值;2.堆总是一颗完全二叉树;由概念可知堆的两种形态如下图所示1.1堆的向下调整算法比如,随机给出一个数组,逻辑上看做一颗完全二叉树,通过根节点开始向下调整算法可以将其调整成一个小堆(大堆)。需要注意的是使用向下调整算法需要左右子数必须是一个堆。图文解析如下:实现代码:void Swap(HPDataType *arr, int par原创 2020-12-30 10:04:20 · 640 阅读 · 2 评论 -
时间复杂度和空间复杂度
文章目录1.算法效率2.时间复杂度3.空间复杂度4.大O渐进法5.实战运用1.算法效率实现功能相同的程序的效率有的高有的低,这是因为程序算法的效率不同。算法效率分为时间效率(被称为时间复杂度)和空间效率(被称为空间复杂度)。2.时间复杂度一个程序的运行时间是需要经过实际上机测试才能测试出来的,不同的平台测试出来的效率也可能不同,这就很难进行比较;因此采用了时间复杂度这个分析方式:将算法中基本语句的大概执行次数作为算法的时间复杂度;3.空间复杂度空间复杂度计算的是一个程序运行时临时变量的个数,而原创 2020-12-29 12:13:02 · 279 阅读 · 0 评论 -
链表删除节点的一些细节
文章目录1.free释放报错2.二级指针优先级问题3.注意传入的二级指针1.free释放报错有没有代码,调试得好好的一切顺利,到了最后释放的时候却会出错了。这里大概率是越界了比如:2.二级指针优先级问题下图只是举个例子,写法有问题,在第3点中有介绍3.注意传入的二级指针...原创 2020-12-07 15:49:14 · 448 阅读 · 0 评论 -
反转链表
反转一个单链表。示例:输入: 1->2->3->4->5->NULL输出: 5->4->3->2->1->NULL分析如下:单链表为空或者只有一个节点的时候都只需要直接返回。当有一个以上的节点的时候,此时我们需要定义3个指针来完成链表的迭代反转,为什么要3个指针呢?我们知道完成两个元素的交换需要一个临时变量来作为交换容器,很显然链表的反转就是地址的交换,在进行链表反转的时候,我们需要一个变量来存储下一个节点位置,否则当进行交换之后,原创 2020-12-08 22:10:53 · 278 阅读 · 1 评论 -
给定一个链表,返回链表开始入环的第一个节点。 如果链表无环,则返回 NULL
题目:分析返回入环的第一个节点之前我们要判断是否成环,判断方法如下判断了是否成环之后怎么找到成环的第一个节点呢,分析如下代码/** * Definition for singly-linked list. * struct ListNode { * int val; * struct ListNode *next; * }; */struct ListNode *detectCycle(struct ListNode *head) { //先判断是不是环原创 2020-12-10 21:16:34 · 2686 阅读 · 8 评论 -
给定一个链表,每个节点包含一个额外增加的随机指针,该指针可以指向链表中的任何节点或空节点(何谓深拷贝)
文章目录何谓深拷贝解题题目方法1方法2当事人表示非常后悔没错今天非常头铁,一道题看题目看了一个小时,仅仅是看题目(而不是想题目.)…,我这该死的铁头,温柔不屈的倔强;(我标黑一点,涨个记性)leetcode上面的一道题目,深拷贝?看不懂的名词直接略过,直接开干,题目看了一遍又一遍,鼠标都快点烂了,最后放弃了自认为的一丝尊严,点开了答案。果然,答案里面都是能看懂题目的大佬(小声bb,题目都看不懂做个球呀)。然后再对题目扣字眼,找到了被我抛弃的深拷贝,什么是深拷贝呢,接下来谈谈这该死的深拷贝;何谓深拷贝原创 2020-12-11 20:39:50 · 420 阅读 · 0 评论 -
对链表进行插入排序
对链表进行插入排序题目解法代码题目leetcode题目链接: link.解法代码struct ListNode* insertionSortList(struct ListNode* head){ if(head==NULL) return head; struct ListNode *newhead=(struct ListNode*)malloc(sizeof(struct ListNode));//哨兵位 newhead->next=head;原创 2020-12-12 22:11:07 · 377 阅读 · 0 评论 -
单链表递归
文章目录1.前言2.平常递归3.链表递归1.前言以前觉得递归太麻烦,指针方便多了,于是乎单链表的题目都是用迭代呀,双指针呀来做的。这次突破下自己,将单链表的递归掰扯一下,等下会用一个简单的小题目来作为例子;2.平常递归我先讲一下平常递归的流程,方便待会单链表递归的理解;题目:输入一个数字 N=123,打印出1,2,3;代码:void print(n){if(n>9)print(n/10);printf("%d\n",n%10);}运行流程图:3.链表递归链表递归其实也原创 2020-12-23 08:51:13 · 1478 阅读 · 1 评论 -
设计你的循环队列实现。 循环队列是一种线性数据结构,其操作表现基于 FIFO(先进先出)原则并且队尾被连接在队首之后以形成一个循环。
文章目录1.前言2.带有元素个数size的编写方式2.1条件假设2.2编写逻辑2.3实现代码3.不带元素个数的编写方式3.1条件假设3.2编写逻辑3.3实现代码1.前言环形队列有两种编写方式,一种是队列中包含元素的个数,另外一种是不包含元素的个数;接下来将介绍这两种队列的编写方式以及区别;leetcood题目链接;2.带有元素个数size的编写方式2.1条件假设2.2编写逻辑2.3实现代码typedef struct { //int size; int k;原创 2020-12-27 13:39:14 · 1102 阅读 · 0 评论 -
栈模拟队列,队列模拟栈
文章目录1.前言2.栈模拟实现队列的过程3.队列模拟栈的过程3.1一个队列模拟栈的过程3.2用两个队列来模拟栈的过程1.前言先来介绍一下栈和队列的区别。栈:元素先进后出,从栈顶入栈和出栈;队列:元素先进先出,元素从从队尾出队,从队首出队;接下来将描述用栈模拟队列以及用队列模拟栈的实现过程;2.栈模拟实现队列的过程3.队列模拟栈的过程3.1一个队列模拟栈的过程3.2用两个队列来模拟栈的过程...原创 2020-12-27 15:51:15 · 746 阅读 · 0 评论