数据结构与算法
如题,数据结构与算法
我叫RT
无它,唯手熟耳。
心之所向,莫向外求。
展开
-
最短路径 Dijkstra算法 python+C++
class Solution {public: int networkBecomesIdle(vector<vector<int>>& edges, vector<int>& patience) { int n = patience.size(); vector<vector<int>> adj(n); vector<bool> visit(n, f原创 2022-03-21 02:41:55 · 2073 阅读 · 0 评论 -
【高级数据结构】 Trie | 字典树 前缀树
数据结构可视化:https://www.cs.usfca.edu/~galles/visualization/Trie.html字典树结构,每个结点有两个成员。struct TrieNode { bool isWorldEnd; // 标记当前字母是否为单词的结尾 TrieNode* children[26]; // 使用26个位置标记字母} 其中,children数组的26个位置分别代表26个字母。children初始状态都为nullptr,如果children[i] 不为nullpt原创 2021-12-28 17:18:48 · 226 阅读 · 2 评论 -
快排——一次划分
/* 最接近点对 */int OnePartition(int* ar, int left, int right){ int mid = left; // 基准 while (left < right) { while (left < right) { if (ar[right] >= ar[mid]) right--; else { swap(ar[right], ar[left++]); break; } } while (lef原创 2021-01-29 18:41:21 · 424 阅读 · 0 评论 -
线索二叉树
1个结点存在2个空指针域,2个结点存在3个指针域,3个结点存在4个指针域,… , n个结点存在n+1个指针域。将空孩子域分别指向其前驱和后继,充分的利用起每个叶子结点,就可以将二叉树线索化,使其变成一个双向链表。实现原理标记是否是叶子结点,叶子结点的左右孩子域指向前驱与后继,普通的结点的左右孩子域指向左右孩子结点。二叉树的线索存储结构定义代码如下;/*树的双亲表示法结点结构定义*/#define MAX TREE_SIZE 100typedef int TElemType; .原创 2021-03-27 14:39:51 · 62 阅读 · 0 评论 -
【高级数据结构】线段树 | 求区间和
线段树是一种二叉搜索树,与区间树相似,它将一个区间划分成一些单元区间,每个单元区间对应线段树中的一个叶结点。用于数组的区间求和,且数组内的元素可能改变。对于数组 arr = {1,2,3,4,5,6,6,7,…} 而言,要求得 i~j 下标数据的和,我们需要对数组进行遍历。时间复杂度O(n)。而修改数组中某个元素的值,时间复杂度为O(1)。我们可以使用一个 sum_arr 前缀和数组来保存 0~i 位置的和,这样以来,求 i~j 的区间和等同于 arr[j] - arr[i-1]。 时间复杂度为 O(原创 2021-09-28 00:15:02 · 636 阅读 · 0 评论 -
BST树 非递归中序遍历 | 中序线索化 | AVL树
带父指针的BST树。typedef int Type;typedef struct BSTreeNode{ Type key; // 关键字(键值) struct BSTreeNode *left; // 左孩子 struct BSTreeNode *right; // 右孩子 struct BSTreeNode *parent; // 父结点}BstNode, *BSTree;BstNode * First(BstNode *原创 2021-04-14 00:36:51 · 236 阅读 · 0 评论 -
算法 | 八大排序
基数排序待更新…#include <iostream>#include <vector>#include <string>#include <ctime>#include <stack>#include <iterator>#include <algorithm>using std::cin;using std::cout;using std::endl;using std::vector;/原创 2021-03-21 19:13:09 · 91 阅读 · 2 评论 -
算法 | 串匹配算法之KMP算法及其优化
KMP算法是一种改进的字符串匹配算法,由D.E.Knuth,J.H.Morris和V.R.Pratt提出的,因此人们称它为克努特—莫里斯—普拉特操作(简称KMP算法)。KMP算法的核心是利用匹配失败后的信息,尽量减少模式串与主串的匹配次数以达到快速匹配的目的。具体实现就是通过一个next()函数实现,函数本身包含了模式串的局部匹配信息。KMP算法的时间复杂度O(m+n)。待匹配串s:A B...原创 2019-11-08 23:11:16 · 304 阅读 · 0 评论 -
高级数据结构 | 二叉树判定— 是否为?满二叉树、完全二叉树、二叉搜索树(BST树)、(后面待更新... ...)平衡二叉树、对称二叉树、子树、相同的树 ...
二叉树的判定是否是满二叉树。是否是完全二叉树。是否是BST树是否是平衡二叉树是否是对称二叉树是否是一棵树的子树两个二叉树是否相同是否是满二叉树。满二叉树:除最后一层无任何子节点外,每一层上的所有结点都有两个子结点的二叉树。一个二叉树,如果每一个层的结点数都达到最大值,则这个二叉树就是满二叉树。并且,一个满二叉树的第K层,结点总数是(2^k) -1。从数学上看,满二叉树的各个层的结点数形成...原创 2020-04-20 18:08:50 · 391 阅读 · 1 评论 -
高级数据结构 | 二叉树顺存储及其遍历
二叉树除过使用链式存储外还可以使用线性存储,这里我们使用数组模拟这一过程。如下所示为一颗二叉树,其中根节点为 0 11,其中0是我们人为加上的序号,通过序号之间的关系把二叉树存放到数组中。5 810 111 452 633 224 576 55对于以上二叉树,我们使用数组进行存储:int arr[] = { 11,45,63,22,57,81,55 };0...原创 2020-04-17 00:24:04 · 260 阅读 · 2 评论 -
高级数据结构 | 二叉树查询 —层次、深度、结点数、双亲结点、公共祖先、路径总和 ...
文章目录一、查询二叉树第K层的数据元素递归实现递归实现输出测试二、查询二叉树的深度和结点数2.1 树的深度2.2 树的结点数三、查询二叉树中元素位置四、查询结点的双亲五、查询两结点的公共祖先六、查询二叉树的路径总和二叉树:.ABGCDHEF一、查询二叉树第K层的数据元素假设根结点所在的层数为第一层,则左右孩子所在的层为第二层,层数依次向下递归增长。递归实现void PrintK_r...原创 2020-04-14 19:39:46 · 1174 阅读 · 1 评论 -
高级数据结构 | 二叉树层次遍历 —从左至右的顺序层次遍历 & 左右交替的“之“字型遍历 ...
对于一个二叉树而言,通常有两种遍历方式,一种是深度优先遍历(Depth First Search),一种是广度优先搜索(Breadth First Search)。文章目录1、顺序层次遍历2、左右交替的层序遍历2.1 双端队列实现2.2 两个栈实现2.3 栈与队列实现在前文中提到的,二叉树的先序遍历、中序遍历、后序遍历都属于深度优先遍历,而我们今天所讲的层次遍历就属于广度优先遍历。ABGCD...原创 2020-04-13 02:53:00 · 1927 阅读 · 1 评论 -
高级数据结构 | 二叉树遍历 —非递归遍历,判断结点引用次数进行优先深度遍历 ...
在此之前,对非递归先序遍历还有一种新的思路,具体方法如下:非递归先序遍历此方法类似于非递归实现的快排,利用栈的先进后出特性,在其中一个元素没有完全断绝关系前,下一个元素绝没有机会出栈。同时,这种方法与二叉树的层次遍历有异曲同工之妙,只不过层次遍历使用的数据结构为队列。如上图,在出栈时判断结点是否有左右孩子,有则每次先将右孩子入栈,再将左孩子入栈。同时出栈时每次都先出左孩子的结点,如果左孩子...原创 2020-04-12 20:56:09 · 287 阅读 · 1 评论 -
高级数据结构 | 二叉树遍历 —递归与非递归实现:先序、中序、后序遍历二叉树 ...
递归遍历二叉树/* 先序遍历 */void PreOrder(struct BtNode* p){ if (NULL != p) { printf("%c ", p->data); PreOrder(p->leftchild); PreOrder(p->rightchild); }}/* 中序遍历 */void InOrder(struct BtNo...原创 2020-04-11 01:34:15 · 408 阅读 · 1 评论 -
高级数据结构 | 创建二叉树 —递归与非递归实现:先序中序创建、中序后序创建 ...
对于使用二叉链表结构存储的二叉树,我们通常使用递归—先序的方式创建,并且在输入树中结点的数据时需要人为的加入‘#’以表示叶子节点(度为0的点)。而我们知道,给定一颗二叉树的中序遍历序列和其他任意一种优先深度遍历方式的序列都可以得到其完整的二叉树结构,那么我们能不能使用计算机来完成这一转化呢?换言之,我们本章重点为:使用先序和中序创建二叉树使用中序和后序创建二叉树文章目录一、使用递归创...原创 2020-04-08 21:04:55 · 2606 阅读 · 1 评论 -
高级数据结构 | 树和二叉树
树的定义:树是由 n (n>= 0)个结点组成的有限集合。如果 n = 0,称为空树;如果 n > 0,则有一个特定的称之为根(root)的结点,它只有直接后继,但没有直接前驱;除根以外的其它结点划分为 m (m >= 0)个互不相交的有限集合 T0, T1, …, Tm-1,每个集合又是一棵树,并且称之为根的子树(subTree)。每棵子树的根结点有且仅有一个直接前驱,...原创 2020-04-07 19:46:03 · 319 阅读 · 1 评论 -
数据结构与算法 | 【分治策略 || 排列树 & 子集树】——全排列、求子集问题...
全排列问题设 R={r1,r2,... rn}R=\{r_1,r_2,... \ r_n\}R={r1,r2,... rn} 是要进行排列的n个元素, Ri=R−{ri}R_i=R-\{r_i\}Ri=R−{ri} 。集合X中元素的全排列记为 perm(X)perm(X)perm(X) 。(r1)perm(X)(r_1)perm(X)(r1)perm(X) 表示在...原创 2020-04-01 21:10:43 · 742 阅读 · 1 评论 -
递归调用分析 | 三种递归传值方式的区别
递归函数:一个含直接或间接调用本函数语句的函数被称之为递归函数。在很多的编程实例中都会用到递归的方式解决问题,在许多问题上使用递归的思想解题也会非常方便。使用递归调用的代码可读性高,易于理解。就拿斐波那契数列为列,在初学编程时应该都使用过递归求斐波那契数列吧。递归的实例还有很多,如我们的汉诺塔问题,构建二叉树等等。相信现在让大家用递归写一个递归求阶乘什么的都分分钟可以解决,递归嘛,简单的很。可是...原创 2020-04-01 18:28:08 · 788 阅读 · 1 评论 -
数据结构与算法 | 【二分查询】进阶与优化 ——区间查询、递归查询、0.618优化...
二分查询也称折半查找(Binary Search)、二分查找,它是一种效率较高的查找方法。但是,二分查询要求线性表必须采用顺序存储结构,而且表中元素按关键字有序排列。对于一个顺序存储结构我们最熟悉的莫过于数组了,在使用数组对其内部的元素进行随机访问是非常高效的。并且数组的使用也是非常方便,相信对于数组的遍历以及查找的算法对于大家来说都轻而易举。但是呢,有时候在一些简单小问题中也会有令我们不容忽视...原创 2020-03-29 15:04:08 · 343 阅读 · 0 评论 -
数据结构与算法 | 【斐波那契数列与递归】
示例3:无穷数列 1,1,2,3,5,13,21,34,55,…, 称为 Fibonacci 数列,计算第n位数列。示例4:有一个整型数组,数值无序,使用循环和递归完成打印和查询。Print_Ar;Find_Ar;示例4:如果数组有序,使用二分查询。示例4:全排列,子集问题。练习:汉诺塔问题,青蛙跳台阶问题,兔子繁殖问题。...原创 2020-03-28 16:24:48 · 548 阅读 · 0 评论 -
数据结构与算法 | 【分治策略与递归】——求阶乘、整数数位输出、最大公约数(四种方法)
分治策略:是将规模比较大的问题可分割成规模较小的相同问题。问题不变,规模变小。这自然导致递归过程的产生。分治与递归像一对孪生兄弟,经常同时应用在算法设计之中,并由此产生许多高效算法。递归:若一个函数直接地或间接地调用自己,则称这个函数是递归的函数。分治法所能解决的问题一般具有以下四个特征:该问题的规模缩小到一-定的程度就可以容易地解决。该问题可以分解为若干个规模较小的相同问题。使用小...原创 2020-03-28 00:53:59 · 1856 阅读 · 0 评论 -
数据结构基础(线性表与栈与队列)
目录定长顺序表不定长顺序表单链表双向链表循环链表顺序栈链栈顺序队列链式队列定长顺序表 SeqlistSeqlist.h#pragma once // 防止头文件重复包含,适用于VS编译器下/* 防止头文件重复包含#ifndef __SEQLIST_H#define __SEQLIST_H…………#endif*/typedef i...原创 2019-11-09 02:20:15 · 274 阅读 · 0 评论