![](https://img-blog.csdnimg.cn/20201014180756916.png?x-oss-process=image/resize,m_fixed,h_64,w_64)
数据结构与算法
王大碗Dw
志不强者智不达
成为自己小时候想象的样子!
展开
-
跟着陈姥姥学习数据结构之平衡二叉树
陈姥姥是浙江大学的一名老师,她在mooc上的《数据结构》广受好评,我也专门进行了学习,课讲的确实很好,适合系统地学习数据结构。真正意义上的,好大学没有围墙。什么是平衡二叉树重要的概念:平衡因子平衡二叉树的调整平衡二叉树的树高差的绝对值要小于等于1。但是如果此时再插入一个元素很可能就破坏了树高差,所以要对平衡二叉树进行调整。其中发现不衡的节点叫做”发现者“,破坏平衡的叫做”麻烦节点“。破坏和调整为以下四种情况:RR插入–》RR旋转LL插入 --》LL旋转LR插入 --》LR旋原创 2021-03-24 11:08:42 · 148 阅读 · 0 评论 -
跟着陈姥姥学习数据结构之二叉搜索树
陈姥姥是浙江大学的一名老师,她在mooc上的《数据结构》广受好评,我也专门进行了学习,课讲的确实很好,适合系统地学习数据结构。真正意义上的,好大学没有围墙。二叉搜索树(二叉排序树)相关操作也就是常用的五个函数。查找最大最小元素插入插入的操作和查询很像,将要插入的元素和根节点比较,如果大于走右子树,小于走左子树,直到插入到合适的位置。代码实现递归方法:BinTree Insert( BinTree BST, ElementType X ){ if( !BST )原创 2021-03-24 10:26:27 · 144 阅读 · 0 评论 -
跟着陈姥姥学习数据结构之二叉树的遍历
陈姥姥是浙江大学的一名老师,她在mooc上的《数据结构》广受好评,我也专门进行了学习,课讲的确实很好,适合系统地学习数据结构。真正意义上的,好大学没有围墙。二叉树的遍历如何记忆?根先遍历,就是前序遍历;根在中间遍历,就是中序遍历;后序遍历,就是根节点在最后面。几种遍历?前序遍历中序遍历后序遍历层次遍历前序遍历递归遍历void PreorderTraversal( BinTree BT ){ if( BT ) { printf("%d ", BT原创 2021-03-23 16:28:36 · 119 阅读 · 0 评论 -
跟着陈姥姥学习数据结构之二叉树及存储结构
二叉树定义特殊二叉树1.斜二叉树2.完美二叉树(满二叉树)3.完全二叉树完美二叉树最后一层,可以不满,但要按顺序。以下这个就不是完全二叉树二叉树的重要性质第三个性质尤其重要,会经常用到。二叉树的抽象数据类型定义最重要的操作是遍历操作,留到下一篇文章中。二叉树的存储结构本文最重要的一块内容。二叉树的存储结构有俩种:1.顺序存储结构2.链式存储结构1.顺序存储结构不做详细说明。2.链式存储最常用的是链式存储,因为二叉树,每个节点最多有俩个子节点,左右孩子,所以原创 2021-03-23 15:32:03 · 112 阅读 · 0 评论 -
跟着陈姥姥学习数据结构之树的基本概念
陈姥姥是浙江大学的一名老师,她在mooc上的《数据结构》广受好评,我也专门进行了学习,课讲的确实很好,适合系统地学习数据结构。真正意义上的,好大学没有围墙。引出二分查找实际上就是新进行排序,然后找mid元素进行比较,这实际上用的就是二叉排序树。然后为什么二分查找能比正常查找快那么多呢?实际上从二叉排序树的结构上来看,二分查找查找最多的次数就是二叉树的深度,所以效率提高了很多。树注意事项:1.树的结点是不能相交的2.也就是除根结点外的每个节点有且只有一个父节点。3.一个n个节点的树只原创 2021-03-23 10:42:19 · 163 阅读 · 0 评论 -
跟着陈姥姥学习数据结构之栈
陈姥姥是浙江大学的一名老师,她在mooc上的《数据结构》广受好评,我也专门进行了学习,课讲的确实很好,适合系统地学习数据结构。真正意义上的,好大学没有围墙。栈栈的定义:栈是一种运算受限的线性表,其限制是指只仅允许在表的一端进行插入和删除操作,这一端被称为栈顶(Top),相对地,把另一端称为栈底(Bottom)。栈的操作:栈的应用:栈最重要的一种用法是用来做算数运算的后缀表达式。代码实现最后附上栈的顺序实现和链式实现:顺序实现typedef int Position;s原创 2021-03-22 22:31:45 · 264 阅读 · 0 评论 -
面试常考之二叉排序树(二叉查找树)[c++源码]
题目:用C++实现一个二叉排序树,完成创建、插入节点、删除节点、查找结点等功能什么是二叉查找树?二叉排序树要么是空二叉树,要么具有如下特点:二叉排序树中,如果其根结点有左子树,那么左子树上所有结点的值都小于根结点的值;二叉排序树中,如果其根结点有右子树,那么右子树上所有结点的值都大小根结点的值;二叉排序树的左右子树也要求都是二叉排序树;代码实现:class Node{public: int data; //数据 Node *parent;//父亲节点 Node *left;原创 2021-03-21 23:14:47 · 182 阅读 · 0 评论 -
面试常考的c++实现单链表的各种操作(附c++代码)
单链表是笔试或者面试中常考的题型,常考的考点一般是:1.单链表的建立2.单链表的测长3.单链表的打印4.单链表节点的查找5.单链表节点的插入6.单链表节点的删除7.单链表的逆置8.寻找单链表的中间元素9.判断是否存在循环链表代码实现1.单链表的建立typedef struct node{ int data;//节点内容 node *next;//下一个节点}node;node *SingleLinkCreate(){ int i = 0; node *head原创 2021-03-21 21:15:26 · 250 阅读 · 0 评论 -
剑指 Offer 59 - II. 队列的最大值[C++ 辅助队列]
题目请定义一个队列并实现函数 max_value 得到队列里的最大值,要求函数max_value、push_back 和 pop_front 的均摊时间复杂度都是O(1)。若队列为空,pop_front 和 max_value 需要返回 -1思考过程:我们的题目中有一个要求:时间复杂度为O(1)。队列push_back 和 pop_front的操作时间复杂度本来就是O(1),所以我们只需要是max_value()做到时间复杂度为O(1)。第一时间想到的就是辅助队列(类似之前的辅助栈)。但稍微原创 2021-03-10 16:31:38 · 151 阅读 · 0 评论 -
剑指Offer-35.-复杂链表的复制-C++实现
/*// Definition for a Node.class Node {public: int val; Node* next; Node* random; Node(int _val) { val = _val; next = NULL; random = NULL; }};*/class Solution {public: Node* copyRandomList(Node* h原创 2021-03-08 15:56:59 · 77 阅读 · 1 评论 -
剑指Offer-35-复杂链表的复制[哈希表法]
题目:请实现 copyRandomList 函数,复制一个复杂链表。在复杂链表中,每个节点除了有一个 next 指针指向下一个节点,还有一个 random 指针指向链表中的任意节点或者 null。解题过程:方法1:哈希表法:利用哈希表的查询特点,考虑构建 原链表节点 和 新链表对应节点 的键值对映射关系 ,再遍历构建新链表各节点的 next 和 random 引用指向即可。1.先声明一个map。2.然后根据原节点,依次复制新的节点,在map中添加映射键对;3.再依次遍历复制next和ran原创 2021-03-08 15:38:39 · 132 阅读 · 0 评论 -
反转链表[递归法与迭代法]
题目:定义一个函数,输入一个链表的头节点,反转该链表并输出反转后链表的头节点。示例:输入: 1->2->3->4->5->NULL输出: 5->4->3->2->1->NULL限制:0 <= 节点个数 <= 5000迭代法(双指针法):依次迭代每一个节点,修改节点的指向,将next节点指向,修改为原pre节点。复杂度分析:时间复杂度 O(N) : 遍历链表使用线性大小时间。空间复杂度 O(1) : 变量 p原创 2021-03-07 17:41:33 · 165 阅读 · 0 评论 -
剑指offer-09-用两个栈实现队列[c++实现]
题目:用两个栈实现一个队列。队列的声明如下,请实现它的两个函数 appendTail 和 deleteHead ,分别完成在队列尾部插入整数和在队列头部删除整数的功能。(若队列中没有元素,deleteHead 操作返回 -1 )题目解读:要求:使用俩个栈模拟队列栈是先进后出的,我们使用俩个栈,其中栈A入栈,先进后出地将元素装入栈B,那么此时栈B中的元素就是逆序的,然后栈B中的元素出栈元素,先进后出,相当于将A中的元素实现了先进先出。例如元素进入顺序 :123456A栈中元素顺序:123456;原创 2021-03-07 16:34:00 · 94 阅读 · 0 评论 -
剑指offer-06-从尾到头打印链表
题目输入一个链表的头节点,从尾到头反过来返回每个节点的值(用数组返回)。示例 1:输入:head = [1,3,2] 输出:[2,3,1]限制:0 <= 链表长度 <= 10000解题过程遇到的问题:1.如何找到链表的尾节点?2.如何知道链表的长度?题解:1.递推法:利用递归,先递推至链表末端;回溯时,依次将节点值加入列表,即可实现链表值的倒序输出。复杂度分析:时间复杂度 O(N)O(N): 遍历链表,递归 NN 次。空间复杂度 O(N)O(N): 系统递归需要使原创 2021-03-07 12:00:27 · 110 阅读 · 0 评论 -
《剑指offer》05 替换空格
开始刷算法题,记录并监督自己刷题题目:替换空格请实现一个函数,把字符串 s 中的每个空格替换成"%20"示例 1:输入:s = “We are happy.” 输出:“We%20are%20happy.”刷题过程:因为对string类的不熟悉,在字符串长度上使用了sizeof(s),但实际上求string类的长度,我们可以使用s.size()和s.length()。并且忘记了string可以当成字符串数组,错误地使用了地址,比较麻烦。题解:class Solution {publ原创 2021-03-07 11:07:18 · 64 阅读 · 0 评论 -
再学一遍单链表
学习数据结构笔记:本篇主要学习资源来自leetcode单链表长什么样: 值;链接到下一个结点的指针。节点定义:// Definition for singly-linked list.struct SinglyListNode { int val; SinglyListNode *next; SinglyListNode(int x) : val(x), next(NULL) {}};与数组的不同:1.访问随机元素:链表在访问随机元素时,性能比较差。 数原创 2020-09-12 15:22:25 · 76 阅读 · 0 评论