
数据结构与算法
王大碗Dw
志不强者智不达
成为自己小时候想象的样子!
展开
专栏收录文章
- 默认排序
- 最新发布
- 最早发布
- 最多阅读
- 最少阅读
-
跟着陈姥姥学习数据结构之平衡二叉树
陈姥姥是浙江大学的一名老师,她在mooc上的《数据结构》广受好评,我也专门进行了学习,课讲的确实很好,适合系统地学习数据结构。 真正意义上的,好大学没有围墙。 什么是平衡二叉树 重要的概念: 平衡因子 平衡二叉树的调整 平衡二叉树的树高差的绝对值要小于等于1。 但是如果此时再插入一个元素很可能就破坏了树高差,所以要对平衡二叉树进行调整。 其中发现不衡的节点叫做”发现者“,破坏平衡的叫做”麻烦节点“。 破坏和调整为以下四种情况: RR插入–》RR旋转 LL插入 --》LL旋转 LR插入 --》LR旋原创 2021-03-24 11:08:42 · 215 阅读 · 0 评论 -
跟着陈姥姥学习数据结构之二叉搜索树
陈姥姥是浙江大学的一名老师,她在mooc上的《数据结构》广受好评,我也专门进行了学习,课讲的确实很好,适合系统地学习数据结构。 真正意义上的,好大学没有围墙。 二叉搜索树(二叉排序树) 相关操作 也就是常用的五个函数。 查找 最大最小元素 插入 插入的操作和查询很像,将要插入的元素和根节点比较,如果大于走右子树,小于走左子树,直到插入到合适的位置。 代码实现 递归方法: BinTree Insert( BinTree BST, ElementType X ) { if( !BST )原创 2021-03-24 10:26:27 · 207 阅读 · 0 评论 -
跟着陈姥姥学习数据结构之二叉树的遍历
陈姥姥是浙江大学的一名老师,她在mooc上的《数据结构》广受好评,我也专门进行了学习,课讲的确实很好,适合系统地学习数据结构。 真正意义上的,好大学没有围墙。 二叉树的遍历 如何记忆? 根先遍历,就是前序遍历;根在中间遍历,就是中序遍历;后序遍历,就是根节点在最后面。 几种遍历? 前序遍历 中序遍历 后序遍历 层次遍历 前序遍历 递归遍历 void PreorderTraversal( BinTree BT ) { if( BT ) { printf("%d ", BT原创 2021-03-23 16:28:36 · 164 阅读 · 0 评论 -
跟着陈姥姥学习数据结构之二叉树及存储结构
二叉树定义 特殊二叉树 1.斜二叉树 2.完美二叉树(满二叉树) 3.完全二叉树 完美二叉树最后一层,可以不满,但要按顺序。 以下这个就不是完全二叉树 二叉树的重要性质 第三个性质尤其重要,会经常用到。 二叉树的抽象数据类型定义 最重要的操作是遍历操作,留到下一篇文章中。 二叉树的存储结构 本文最重要的一块内容。 二叉树的存储结构有俩种: 1.顺序存储结构 2.链式存储结构 1.顺序存储结构 不做详细说明。 2.链式存储 最常用的是链式存储,因为二叉树,每个节点最多有俩个子节点,左右孩子,所以原创 2021-03-23 15:32:03 · 150 阅读 · 0 评论 -
跟着陈姥姥学习数据结构之树的基本概念
陈姥姥是浙江大学的一名老师,她在mooc上的《数据结构》广受好评,我也专门进行了学习,课讲的确实很好,适合系统地学习数据结构。 真正意义上的,好大学没有围墙。 引出 二分查找实际上就是新进行排序,然后找mid元素进行比较,这实际上用的就是二叉排序树。 然后为什么二分查找能比正常查找快那么多呢? 实际上从二叉排序树的结构上来看,二分查找查找最多的次数就是二叉树的深度,所以效率提高了很多。 树 注意事项: 1.树的结点是不能相交的 2.也就是除根结点外的每个节点有且只有一个父节点。 3.一个n个节点的树只原创 2021-03-23 10:42:19 · 230 阅读 · 0 评论 -
跟着陈姥姥学习数据结构之栈
陈姥姥是浙江大学的一名老师,她在mooc上的《数据结构》广受好评,我也专门进行了学习,课讲的确实很好,适合系统地学习数据结构。 真正意义上的,好大学没有围墙。 栈 栈的定义: 栈是一种运算受限的线性表,其限制是指只仅允许在表的一端进行插入和删除操作,这一端被称为栈顶(Top),相对地,把另一端称为栈底(Bottom)。 栈的操作: 栈的应用: 栈最重要的一种用法是用来做算数运算的后缀表达式。 代码实现 最后附上栈的顺序实现和链式实现: 顺序实现 typedef int Position; s原创 2021-03-22 22:31:45 · 330 阅读 · 0 评论 -
面试常考之二叉排序树(二叉查找树)[c++源码]
题目: 用C++实现一个二叉排序树,完成创建、插入节点、删除节点、查找结点等功能 什么是二叉查找树? 二叉排序树要么是空二叉树,要么具有如下特点: 二叉排序树中,如果其根结点有左子树,那么左子树上所有结点的值都小于根结点的值; 二叉排序树中,如果其根结点有右子树,那么右子树上所有结点的值都大小根结点的值; 二叉排序树的左右子树也要求都是二叉排序树; 代码实现: class Node { public: int data; //数据 Node *parent;//父亲节点 Node *left;原创 2021-03-21 23:14:47 · 257 阅读 · 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 · 315 阅读 · 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 · 213 阅读 · 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 · 130 阅读 · 1 评论 -
剑指Offer-35-复杂链表的复制[哈希表法]
题目: 请实现 copyRandomList 函数,复制一个复杂链表。在复杂链表中,每个节点除了有一个 next 指针指向下一个节点,还有一个 random 指针指向链表中的任意节点或者 null。 解题过程: 方法1:哈希表法: 利用哈希表的查询特点,考虑构建 原链表节点 和 新链表对应节点 的键值对映射关系 ,再遍历构建新链表各节点的 next 和 random 引用指向即可。 1.先声明一个map。 2.然后根据原节点,依次复制新的节点,在map中添加映射键对; 3.再依次遍历复制next和ran原创 2021-03-08 15:38:39 · 212 阅读 · 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 · 227 阅读 · 0 评论 -
剑指offer-09-用两个栈实现队列[c++实现]
题目: 用两个栈实现一个队列。队列的声明如下,请实现它的两个函数 appendTail 和 deleteHead ,分别完成在队列尾部插入整数和在队列头部删除整数的功能。(若队列中没有元素,deleteHead 操作返回 -1 ) 题目解读: 要求:使用俩个栈模拟队列 栈是先进后出的,我们使用俩个栈,其中栈A入栈,先进后出地将元素装入栈B,那么此时栈B中的元素就是逆序的,然后栈B中的元素出栈元素,先进后出,相当于将A中的元素实现了先进先出。 例如元素进入顺序 :123456 A栈中元素顺序:123456;原创 2021-03-07 16:34:00 · 129 阅读 · 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 · 152 阅读 · 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 · 101 阅读 · 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 · 134 阅读 · 0 评论