
数据结构与算法
文章平均质量分 53
该专栏是数据结构与算法的学习笔记专栏
西城风雨楼
if you don't use it ,you will lose it.
展开
专栏收录文章
- 默认排序
- 最新发布
- 最早发布
- 最多阅读
- 最少阅读
-
链表中点技巧:快慢指针定位链表中点
单链表的节点数目可能是奇数或者偶数,奇数节点的链表中点是唯一的,偶数节点的链表中点有两个,分别是上中点和下中点,如下图所示:原创 2023-01-18 16:20:03 · 681 阅读 · 0 评论 -
递归转非递归的一些思考
(英语:Recursion),又译为,在与中,是指在的定义中使用函数自身的方法。递归一词还较常用于描述以方法重复事物的过程。例如,当两面镜子相互之间近似平行时,镜中嵌套的图像是以无限递归的形式出现的。也可以理解为自我复制的过程。简而言之,在计算机中,递归就是指在一个函数中出现了自己调用自己的行为。上面的例子用来求解一个n的阶乘,在f函数中,出现了f自己调用自己的行为,因此f就是一个递归函数。原创 2023-04-26 15:08:58 · 887 阅读 · 1 评论 -
索引排序算法-算法4
学习算法4,字符串篇中索引排序算法的练习实现。原创 2022-09-15 17:14:44 · 194 阅读 · 0 评论 -
一、数据结构系列(堆篇)
堆结构是一棵完全二叉树,和普通的完全二叉树不同,堆对树中节点的取值做了如下的限制:【1】对于堆中的任意节点,它的值总是大于其左右孩子的取值。【2】对于堆中的任意节点,它的值总是小于其左右孩子的取值。如果限制规则是【1】,那么称这种堆为大顶堆。如果限制规则是【2】,那么称这种堆为小顶堆。堆顶一定始终存放着整个堆中最大值或者最小值,这取决于当前是大顶堆还是小顶堆。如果对堆中的每一个节点从上到下,从左到右的顺序进行编号,编号从开始那么节点编号存在如下关系由于堆是一棵完全二叉树,因为完全二叉树的特殊性,除了最后两层原创 2022-06-09 14:29:03 · 452 阅读 · 0 评论 -
二叉树遍历系列02-Morris遍历
二叉树遍历系列02-Morris遍历一、引言Morris遍历是一种时间复杂度为O(N),空间复杂度为O(1)的二叉树遍历方法,Morris遍历是一种迭代遍历,Morris遍历不需要借助额外的栈空间,只需要进行普通的循环迭代即可完成整棵二叉树的遍历,因为Morris通过利用结点空指针,完成了遍历的转移(十分巧妙的想法)二、递归序在二叉树遍历系列01,中讲解了二叉树遍历的递归序,这是一个非常重要的概念,因为这可以帮助我们更好的理解Morris遍历在遍历过程中对先序序列和中序序列以及后序序列的加工(原创 2022-04-20 18:38:15 · 889 阅读 · 2 评论 -
二叉树遍历系列01-递归遍历与递归序
二叉树遍历系列01-递归遍历与递归序一、引言先序遍历先序遍历又名先根遍历,顾名思义,在这种遍历方法中,首先遍历根结点,然后再先序遍历根节点的左孩子,之后先序遍历根节点的右孩子,从这个遍历规则中,我们可以看出,有很明显的递归意味,因此使用递归方法实现树的先序遍历是一种常见的方法,非常简单中序遍历中序遍历,和先序遍历不同的是,中序遍历并不是先访问根节点,中序遍历先访问根节点的左孩子,然后访问根节点,最后访问根节点的右孩子,这个中的意思也就很明显了,就是把根节点的遍历放在左孩子和右孩子的中原创 2022-04-20 16:33:29 · 340 阅读 · 0 评论 -
一个伸展树的实现
伸展树实现(java语言版本)一、伸展树的基本概念伸展树是一种二叉搜索树,伸展树也是一种平衡树,不过伸展树并不像AVL树那样对树的平衡有很严格的要求(左右孩子高度之差不能超过1),伸展树通过一系列的伸展操作,可以保证对伸展树的任意连续M次操作,其时间复杂度不会超过MlogN级别,并且伸展树的实现相较于AVL树也简单了很多,不论是插入还是删除算法二、伸展树的伸展操作伸展树之所以能够保证MlogN的界,就是因为伸展树的伸展操作,每一次调用伸展树的search方法查找一个结点的时候,如果存在,那么就原创 2022-04-20 09:53:25 · 664 阅读 · 0 评论 -
回溯算法之子集问题
回溯算法之子集问题一、回溯算法简介回溯算法是一种穷举算法,因此回溯算法是一种暴力求解的算法,它的时间复杂度可以达到O(N!),但是有些问题我们通过暴力枚举的方式来求解显得更简单,比如经典的子集问题和排列问题二、回溯算法与树的遍历其实回溯算法本质上就是在遍历一棵树,这棵树和我们常见的二叉树不同,这棵树可以是多叉的,一般来说解决回溯问题可以分为两个步骤进行:(1)构造回溯树结构,回溯算法本质上就是在对这棵回溯树进行先序遍历(2)编写树的递归版本的先序遍历三、子集问题3.1 子集问题简介原创 2022-04-16 18:33:18 · 1505 阅读 · 0 评论 -
平衡二叉树(AVL)分析与实现
一、平衡二叉树的简介平衡二叉树的缩写为AVL树,它是一种高度平衡的二叉搜索树,对于平衡二叉树来说,它满足两个基本约束:(1)二叉搜索树的约束:对于任意一个节点,左子树的关键字都小于根节点,右子树的关键字都大于根节点(2)平衡性约束:对于任意一个节点,左右孩子的高度之差的绝对值不超过11.1 相关概念高度平衡二叉树的高度定义和普通树的高度定义相同:树的中某个节点高度定义为:从该节点出发,到其可达的最远的那个叶子节点的路径中的边数。空节点的高度定义为-1,叶子节点的高度定义为0平衡因子原创 2022-04-15 19:48:19 · 921 阅读 · 0 评论 -
二叉查找树的递归实现(基于java语言)
二叉查找树的递归实现一、基本概念二叉查找树是一种特殊的二叉树,特殊就特殊在它的节点的值上,在二叉查找树中任意一个节点的左孩子的关键字,一定小于根节点,右孩子的关键字一定大于根节点二、二叉查找树的基本操作2.1 插入如果根节点为空,那么新插入的节点就是根节点如果根节点不为空,那么让cur指向根节点root,其中cur表示当前正在访问的节点。不妨设新插入的关键字是key,比较cur.key和key的大小,如果key更大,那么让cur=cur.right(因为当前新插入的关键字更大,所以key原创 2022-04-13 16:27:08 · 1039 阅读 · 0 评论 -
随笔练习+表达式树简单实现+二叉树的Morris遍历(先中后)+先序和中序重构二叉树
随笔练习import java.util.Stack;/** * @author 西城风雨楼 */public class ExpressionTree { private TreeNode root; private ExpressionTree() { } /** * 从后缀表达式构建一棵表达式树 * * @param suffix 后缀表达式 * @return 返回构建完毕的表达式树 */ pu原创 2022-04-12 19:00:44 · 517 阅读 · 0 评论 -
并查集算法-双HashMap实现(附LeetCode128题的并查集题解)
双HashMap实现并查集算法原创 2022-03-31 12:42:28 · 728 阅读 · 0 评论 -
数据结构与算法系列(线性表篇)
线性表之双向链表一、双向链表简单介绍双向链表是单链表的一种扩展,单链表中每一个节点只保存一个指针域,该指针域唯一的指向当前节点的直接后继,而双向链表在单链表节点类型的基础之上,额外增加了一个前驱指针域,该指针域指向当前节点的直接前驱,正是因为有了直接前驱指针,双向链表的插入和删除算法和单链表也略有不同二、时间复杂度2.1 查找数据元素在双向链表中查找一个元素同样需要遍历链表中的元素,因此时间复杂度是O(N)2.2 插入一个元素的时间复杂度在双向链表中插入一个元素,时间复杂度是O(1)原创 2022-03-26 16:14:52 · 2509 阅读 · 0 评论 -
数据结构与算法系列(线性表篇)
线性表之单链表一、单链表简单介绍单链表是线性表的链式实现,单链表是一种比较简单的结构,单链表由若干个节点组成,节点包含数据域和指针域,其中每一个指针域负责记录单链表中下一个节点的位置二、时间复杂度2.1 查找数据元素单链表不像顺序表那样可以通过索引计算偏移量的方式定位一个元素,想要在单链表中查找一个元素,需要对整个单链表从头到尾进行遍历,因此这需要O(N)的时间复杂度2.2 插入一个元素的时间复杂度在单链表中插入一个新的数据元素,只需要对相应的指针进行改变,因此是O(1)的操作2原创 2022-03-26 16:06:39 · 679 阅读 · 0 评论 -
数据结构与算法系列(线性表篇)
线性表、顺序表实现原创 2022-03-26 16:04:34 · 1632 阅读 · 0 评论 -
2021-07-31
记go语言实现n维数组package ndimarrtype Element int// Array 任意维度的数组type Array struct { Elements []Element // 存放数组的元素 Dim []int // 用于存放数组的维度 HelperConstants []int // 辅助常量,计算偏移量的时候需要这个值}// 给定维度计算偏移量func calOffset(arr *Array, dim ...int) (int, bool) { of原创 2021-07-31 00:09:34 · 99 阅读 · 0 评论 -
二叉树的先序、中序、后序非递归算法C语言实现
二叉树的先序、中序、后序非递归算法C语言实现一、 链式栈结构源码1. 头文件:linkedstack.h#ifndef TREE#define TREE#include "bitree.h"#endif// 栈结点类型struct StackNode { struct BiTNode *data; struct StackNode *next;};// 链式栈类型struct LinkedStack { struct StackNode *top; int size;};原创 2021-03-18 20:29:11 · 608 阅读 · 0 评论 -
根据二叉搜索树的后续遍历数组还原二叉搜索树
递归还原思路:后续遍历的特点,后续数组的最后一个元素一定是根节点二叉搜索树的特点,左子树的关键字均小于根节点,右子树的关键字均大于根节点根据1和2中的特点我们可以得出如下结论:任意给定一个后续遍历数组,我们一定能找到根节点,通过从第一个位置开始遍历该后续数组,当我们找到第一个关键字大于根节点时,该位置就是根节点右子树的起始位置,相应的该位置也就是根节点左子树的结束位置。根据如上阐述,我们可以得出如下递归还原算法:package com.github.dql.bst;public cla原创 2021-03-11 21:21:08 · 472 阅读 · 0 评论 -
根据先序和中序创建二叉树--C语言实现
二叉树结构类型定义如下:struct BTNode { char data; struct BTNode *lChild; struct BTNode *rChild;};先序+后序构建二叉树代码如下:struct BTNode *createWithMidAndPre(struct BTNode *root, char *preSet,原创 2021-02-25 00:25:37 · 2335 阅读 · 0 评论 -
平衡二叉树-Java实现
package com.github.dql.avltree;public class AvlTree<T extends Comparable<T>> { private Node root; public AvlTree() { root = null; } public void create(T[] keys) { for (T key : keys) { Insert(key); } } public void Insert(T ke原创 2021-02-19 22:12:55 · 104 阅读 · 0 评论 -
统计单词个数-C语言实现
统计单词个数-C语言实现问题描述:统计用户输入的句子中的单词的个数,比如:input: hello world! I am the c.output: 6程序思想:设置一个单词计数器:num设置一个使能变量: numEnable,该使能变量的功能就是:2.1 当numEnable等于0的时候不能进行num++操作2.2 当numEnable非0时,则可以进行num++操作初始时num=0, numEnable=1遍历用户输入的字符串,遍历的过程中做如下.原创 2020-12-12 19:38:38 · 8046 阅读 · 0 评论 -
C语言大整数加法
C语言实现大整数加法题目描述:1:大整数加法总时间限制: 1000ms 内存限制: 65536kB描述求两个不超过200位的非负整数的和。输入有两行,每行是一个不超过200位的非负整数,可能有多余的前导0。输出一行,即相加后的结果。结果里不能有多余的前导0,即如果结果是342,那么就不能输出为0342。样例输入22222222222222222222333333333333...原创 2019-03-21 12:30:55 · 34397 阅读 · 21 评论 -
快速排序用C语言可以这么写
快速排序用C语言可以这么写#include <stdio.h>#include <stdlib.h>/** * 将nums中的数据,进行快速排序 * @param nums 待排序的数组 * @param start 数组中待排序序列的起始位置 * @param end 数组中待排序序列的终止位置 */void fastSort(int *nums, int start, int end) { if (start >= end) re原创 2020-12-07 09:39:37 · 198 阅读 · 0 评论 -
C语言原来是这么写归并排序的
归并排序C语言实现#include <stdio.h>#include <stdlib.h>/** * 对nums数组中的数据实现归并排序,升序排序 * @param nums 待排序的数组 * @param start nums中待排序序列的起始位置 * @param end nums中待排序序列的终止位置 */void mergeSort(int *nums, int start, int end) { if (start >= end)原创 2020-12-07 08:53:08 · 204 阅读 · 0 评论 -
二叉堆--insert操作以及deleteMin操作的实现(C语言)
二叉堆--insert操作以及deleteMin操作的实现(C语言)一、概念回顾1. 什么是二叉堆?二叉堆其实就是一棵完全二叉树,但是它相比一般的完全二叉树又多了一些限制:(1)对于二叉堆来说,其根节点的关键字的值要小于其左右子树的关键字的值。(2)二叉堆的任意一个根节点的左右子树也是一个二叉堆(所以,二叉堆也是一个由递归定义出来的数据结构)二叉堆附图:2. 二叉堆的存储结构以及常见性质2.1 常见性质将二叉堆的节点从根节点开始编号,根节点编号为1,从左到右,从原创 2020-11-23 11:58:07 · 1091 阅读 · 1 评论