数据结构
SuSA_
铁壳其外,咸鱼其中
展开
专栏收录文章
- 默认排序
- 最新发布
- 最早发布
- 最多阅读
- 最少阅读
-
堆排序 C++代码实现及思想 排序过程输出 恋上数据结构笔记
复习梗概文章目录复习梗概什么是堆思想?堆排序算法怎么来的?什么是下滤?代码什么是建堆?代码堆排序本体 代码及排序过程输出 和时间复杂度完整代码什么是堆思想?最大堆:树形结构,每一个结点元素都比子结点大堆常常用动态数组存储二叉最大堆能够应用于动态数组,是因为应用了完全二叉树的两个特性:i为当前结点序号,左子结点 = 2i+1,右子结点=2i+2,父结点=floor((i-1)/2),这个是根结点序号为0的情况,这个特质不用死记硬背,想用的时候画个图自己标下序号就试出来了完全二叉树,共n个结点,原创 2021-10-27 19:20:06 · 336 阅读 · 0 评论 -
2021- 10 -13 AVL树的平衡调整(有parent指针) 代码逻辑
AVL平衡调整步骤:插入结点找到 插入节点的 的第一个 不平衡的 非父祖先结点2.1 循环遍历插入结点的祖先结点2.2 在遍历的同时判断该结点是否平衡2.3 平衡则更新当前结点的高度,为了下一次判断是否平衡,不平衡则进行平衡调整平衡则进行平衡调整3.1 判断三个结点的位置关系(LL,RR,LR,RL)3.2 进行平衡3.3 维护结点指针!!!**我犯的错误::有没有可能旋转涉及的三个结点不连在一起? 不可能有没有可能LL RR LR RL之外的情况?? 不原创 2021-10-13 21:16:34 · 280 阅读 · 0 评论 -
2021-10-11 二叉树,二叉搜索树及其相关23个操作 C++实现笔记(复习用,含C指针复习)
学数据结构到现在写的最久的一部分,简单总结一下这一周1.考虑到未来考试要求,实现语言从java换成了C++,没想到意外的顺利2.没别的了,干就完了3.代码肯定有错误的地方,虽然我自认为是完美主义者,但都是为了效率没办法啦//! *指针变量,例如:int b = *p; *代表取值运算符,返回地址指向的值(不是地址本身,p是地址本身)//! 做个比喻*p就是找到地址为p的箱子,然后*打开箱子取出里面的东西,然后把东西赋值给b//! 定义指针变量,例如:int *p = &a; 中的int*原创 2021-10-11 22:36:56 · 233 阅读 · 0 评论 -
2021-10-11 二叉树中查找值为key的结点
主要提醒自己这里的return,还是遍历框架的应用两个使用框架的题的比较//! 二叉树的翻转:本质就是二叉树的遍历的应用//! 以任意形式遍历二叉树的每一个结点,访问每一个结点的同时调换其左右子树//! 中序遍历额外注意一下调换后的参数问题Node *BinarySearchTreesZH::invertTreePreOrder(Node *node){ if (node == nullptr) { return node; } Node *tmp原创 2021-10-11 15:31:19 · 1009 阅读 · 0 评论 -
2021-10-11 ! LeetCode226. 翻转二叉树 的前中后层序遍历写法
还是遍历框架的应用//! 二叉树的翻转:本质就是二叉树的遍历的应用//! 以任意形式遍历二叉树的每一个结点,访问每一个结点的同时调换其左右子树//! 中序遍历额外注意一下调换后的参数问题Node *BinarySearchTreesZH::invertTreePreOrder(Node *node){ if (node == nullptr) { return node; } Node *tmp = node->left; node-&原创 2021-10-11 15:27:40 · 209 阅读 · 0 评论 -
2021-10-11 二叉树 删除结点 (用到parent指针)
太恶心了,三种情况理解就好//! 删除结点void BinarySearchTreesZH::remove(Node *node){ if (node->left != nullptr && node->right != nullptr)//! 把删除度为2 的结点的问题转化为删除 { node->element = predecessor(node)->element; remove(predecessor(原创 2021-10-11 15:24:00 · 174 阅读 · 0 评论 -
2021-10-11 寻找二叉树结点的前驱或后继结点(用到parent指针)
关键是找前驱后继的思想理解了就好//! 查找某个结点的前驱或后继结点(要求结点要有parent指针)//! 前驱结点定义:中序遍历中的前一个结点,而不是二叉树结构中的上一个母结点Node *BinarySearchTreesZH::predecessor(Node *node){ if (node == nullptr) { return node; } //! 前驱结点是左子树中的最右结点 if (node->left != null原创 2021-10-11 15:21:12 · 466 阅读 · 0 评论 -
2021- 10 -9 LeetCode 958. 二叉树的完全性检验(待补完)
二叉树的完全性检验给定一个二叉树,确定它是否是一个完全二叉树。若设二叉树的深度为 h,除第 h 层外,其它各层 (1~h-1) 的结点数都达到最大个数,第 h 层所有的结点都连续集中在最左边,这就是完全二叉树。(注:第 h 层可能包含 1~ 2h 个节点。)。又是层序遍历的应用,我看题解里还有别的很多解法,待我后面学了再回来看这道题//! 检验二叉树是否为完全二叉树//! 层序遍历每一个结点,有三种情况,分情况讨论bool BinarySearchTreesZH::isCompleteT.原创 2021-10-09 20:46:09 · 120 阅读 · 0 评论 -
2021-10-09 求二叉树的高度(递归和迭代版本)
剑指 Offer 55 - I. 二叉树的深度输入一棵二叉树的根节点,求该树的深度。从根节点到叶节点依次经过的节点(含根、叶节点)形成树的一条路径,最长路径的长度为树的深度。和题解写的一比,我写的像坨shit//! 求二叉树的高度,递归版本//! 递归的精髓就在于,把大问题分解为解答过程相同的小问题//! 既然我们要求根节点的高度,根节点的高度又等于其子节点的最大高度加一//! 那么问题就转化为了求每个节点及其子节点的高度,而最小问题就是叶节点的子节点为空,高度为0int BinarySear原创 2021-10-09 20:41:28 · 304 阅读 · 0 评论 -
2021 - 10 -7 ! 二叉树的前序、中序、后序遍历 非递归思路(迭代版本)
//! 前序遍历的非递归版本,精髓在于用栈模拟递归的过程,但实际进栈出栈顺序与递归并不一样,//! 比较抽象,建议画图理解,比较重要void BinarySearchTreesZH::preorderTraversalNoRecursion(Node *node){ stack<Node *> stk; if (node == nullptr) { return; } stk.push(node); while (stk...原创 2021-10-09 20:34:57 · 212 阅读 · 1 评论 -
2021-10-7 !二叉树的层序遍历
好多题都用得上,有机会补张内部队列的图吧//! 层序遍历,很重要,精髓在于对于队列的应用void BinarySearchTreesZH::levelorderTraversal(Node *node){ queue<Node *> list; //创建结构体指针队列,数据类型Node*,但是层序遍历不用指针也可以 if (node == nullptr) { return; } else { list.pus原创 2021-10-09 20:19:55 · 107 阅读 · 0 评论 -
2021-10-7 !二叉树的前序、中序、后序遍历 (递归版本)
非常重要,等下次复习补一张系统栈的图//前序遍历,递归版本,三个遍历的递归写法思想都一致,唯一区别就是在什么时候访问根结点//画个图和栈更好理解,这里不多解释void BinarySearchTreesZH::preorderTraversal(Node *node){ if (node == nullptr) { return; } cout << node->element << " "; preorderTr原创 2021-10-09 20:17:26 · 104 阅读 · 0 评论 -
2021 - 9 -下旬 数据结构- 线性表 -双端循环队列 - java实现
//循环双端队列:Circle Double Ended Queue//本质是对动态数组的优化//队头队尾都可以添加或删除元素//相比于普通循环队列需要注意的点是在队头插入元素时的对front前移的处理public class CircleDequeZH<E> { private int size; private int front; private E elements[]; private static final int DEFAULT_CAP原创 2021-10-06 19:53:15 · 143 阅读 · 0 评论 -
2021 - 9 下旬 数据结构-线性表-循环队列-java实现代码
//循环队列,本质就是用动态数组实现的,且出队入队时间复杂度均O(1)的队列//相比普通队列,增设一个front指针,代表队头,代表下一个出队的元素//循环队列的重点在于队头队尾的元素的下标的计算(本质是映射循环队列中的真实索引),以及队列满的判断条件//真实元素下标:(index+front)%elements.length(index为队列中下标,计算得真实数组中下标)// 队尾:index =size-1 入队位置 index =size 出队位置(队头):front(移动至(front原创 2021-10-06 19:50:50 · 155 阅读 · 0 评论 -
2021-9-下旬 数据结构-线性表-队列-java代码实现(复习用)
话说。。。每次都用现成的类实现,是不是有点偷懒//队列的本质也是线性表,特性为只在线性表首位端进行操作,为先进先出,和生活中排队的队列是一样的//队列涉及到的操作主要是入队(enQueue)和出队(deQueue)//其中,因为出队是在队尾操作,因此,用动态数组实现队列就会涉及到所有元素的前移,O(n)//所以队列这里选择双向链表实现,得益于headnode和lastnode指针,无论入队出队都是O(1),牺牲空间换时间//实际方法实现也和前面都一样,我就节省时间直接用java自带Linkedli原创 2021-10-06 19:48:39 · 139 阅读 · 0 评论 -
2021-9-下旬 数据结构-线性表- 栈 -java代码实现(复习用)
import java.util.ArrayList;import java.util.List;//栈的本质就是线性表,因为总在线性表的表尾端进行操作(出栈入栈),其重要特性为FILO先进后出//所以在实现上选择 动态数组 和 双向链表 的进行出栈入栈的时间复杂度均为O(1),//实现各个方法也和之前学过的差不多,这里偷懒选择用java自带的Arraylist动态数组类简单实现栈//栈的应用很广泛,比如浏览器的前进后退功能其实就是用两个栈做到的public class StackZH<原创 2021-10-06 19:45:49 · 145 阅读 · 0 评论 -
2021-9-下旬 数据结构 - 线性表 - 循环链表 - java实现代码(复习用)
public class CycleLinkedListZH<E> { public static final int ELEMENT_NOT_FOUND = -1; private int size;//定义全局变量(不在函数里的)不初始化默认初始值为0,局部变量则初始值随机 //链表注意的无非那几个:插入删除情况分类,空指针错误 private CycleLinkedListZH.Node<E> headNode; private原创 2021-10-06 19:44:10 · 113 阅读 · 0 评论 -
2021-9-下旬 数据结构-线性表-双向链表-java代码实现(复习用)
public class DoubleLinkedListZH<E> { //调用方法参数是index的记得检测是否在合法范围(0~size-1)内,可以写一个arrangeCheck函数,我懒了,默认输入合法 //双向链表,一个结点前后两个指针 //双向链表相比单链表,add方法和remove方法大改,分四到三种情况,比较重要,时刻注意空指针报错 //clear方法的实际意义涉及到java 的内存管理机制,也可以好好回顾 //tostring也改了一下,原创 2021-10-06 19:41:28 · 178 阅读 · 0 评论 -
2021-9-下旬 数据结构-线性表-链表-java代码实现(复习用)
链表涉及到指针了,这里我还不了解java里对指针的隐藏,又由于以前学过C++里的指针,二者混淆,导致一开始非常蒙,出了很多问题,当然后来随着边写边查,基本都解决了//链表是一种“链式存储”的线性表,所有元素的内存地址不一定是连续的,在结构上已经完全不是数组了//普通线性表有个大缺点,可能会造成内存空间的浪费,有些位置不存元素时也占用内存//那么能不能用到多少就申请多少内存呢?? 所以链表出现了//在定义链表类时,一般在定义链表大类中定义一个子类结点类//链表在结构上,是由头结点和结点组成的,头原创 2021-10-06 19:39:03 · 138 阅读 · 0 评论 -
2021-9-下旬 数据结构-线性表-动态数组-java代码实现
这里写自定义目录标题欢迎使用Markdown编辑器新的改变功能快捷键合理的创建标题,有助于目录的生成如何改变文本的样式插入链接与图片如何插入一段漂亮的代码片生成一个适合你的列表创建一个表格设定内容居中、居左、居右SmartyPants创建一个自定义列表如何创建一个注脚注释也是必不可少的KaTeX数学公式新的甘特图功能,丰富你的文章UML 图表FLowchart流程图导出与导入导出导入欢迎使用Markdown编辑器你好! 这是你第一次使用 Markdown编辑器 所展示的欢迎页。如果你想学习如何使用Mar原创 2021-10-06 19:26:21 · 161 阅读 · 0 评论
分享