《数据结构、算法、LeetCode》
文章平均质量分 73
《数据结构、算法、LeetCode》
u013250861
这个作者很懒,什么都没留下…
展开
-
LeetCode经典300题【C++版】
102-二叉树的层序遍历1047-删除字符串中的所有相邻重复项105-从前序与中序遍历序列构造二叉树107-二叉树的层序遍历II108-将有序数组转换为二叉搜索树112-路径总和(判断路径和是否等于一个数)118-杨辉三角1190-反转每对括号间的子串11-盛最多水的容器125-验证回文串144-二叉树的前序遍历145-二叉树的后序遍历14-最长公共前缀150-逆波兰表达式求值155-最小栈179-最大数198-打家劫舍1-两数之和200.岛屿数量213-打家劫舍II.原创 2022-07-12 23:18:15 · 3900 阅读 · 3 评论 -
LeetCode-题目详解(十二):动态规划(自底向上求解最终结果)【构建dp数组、初始化dp数组(可明显确定的边界情况)、定义状态、构建状态转移方程】、记忆化搜索(自顶向下求解最终结果)
最优化原理指的最优策略具有这样的性质:不论过去状态和决策如何,对前面的决策所形成的状态而言,余下的诸决策必须构成最优策略。简单来说就是一个最优策略的子策略也是必须是最优的,而所有子问题的局部最优解将导致整个问题的全局最优。如果一个问题能满足最优化原理,就称其具有最优子结构性质。这是判断问题能否使用动态规划解决的先决条件,如果一个问题不能满足最优化原理,那么这个问题就不适合用动态规划来求解。整体来说,动态规划算法的时间复杂度比记忆化搜索好,因为没有递归调用函数的时间、以及系统的栈空间。一般来说,自上而下的解原创 2021-05-27 23:34:48 · 494 阅读 · 1 评论 -
LeetCode-题目详解(十一):回溯算法【递归回溯、迭代回溯】【DFS是一个劲往某一个方向搜索;回溯算法建立在DFS基础之上,在搜索过程中,达到结束/裁剪条件后,恢复状态,回溯上一层,再次搜索】
DFS 是一个劲的往某一个方向搜索,而回溯算法建立在 DFS 基础之上的,但不同的是在搜索过程中,达到结束条件后,恢复状态,回溯上一层,再次搜索。因此回溯算法与 DFS 的区别就是有无状态重置「回溯法」实际上一个类似枚举的搜索尝试过程,主要是在搜索尝试过程中寻找问题的解,当发现已不满足求解条件时,就「回溯」返回,尝试别的路径。回溯法是一种算法思想,而递归是一种编程方法,回溯法可以用递归来实现。回溯法的整体思路是:搜索每一条路,每次回溯是对具体的一条路径而言的。对当前搜索路径下的的未探索区域进行搜索,则可能有原创 2021-06-14 22:50:53 · 482 阅读 · 0 评论 -
LeetCode-题目详解:贪心算法【无套路、无框架】
因为贪心无套路!没有个整体的贪心框架解决一些列问题,只能是接触各种类型的题目锻炼自己的贪心思维!给定一个非负整数数组 nums ,你最初位于数组的 第一个下标 。数组中的每个元素代表你在该位置可以跳跃的最大长度。判断你是否能够到达最后一个下标。示例 1:示例 2:提示:方法二:贪心(反向推导)可以正向推,也可以反向推,思路是共用的。这里解释一下反向推。定义一个end变量,我们叫它终点。最开始的终点是len - 1。能否到达终点,就看它的:所以我们把这个位置定为新终点。继续看它的前一个/两个/三原创 2021-08-31 22:10:02 · 276 阅读 · 0 评论 -
LeetCode-题目详解(九):双指针【left/right指针;slow/fast指针】、滑动窗口、多指针
滑动窗口法是指通过 left 以及 right 指针来框定一个窗口,当在窗口内的字符串满足题目要求则记录下当前窗口长度并进一步扩张寻找更长的窗口,若不满足则进行窗口平移。滑动窗口法的模板简单介绍上面的模板,模板的思想是:以右指针作为驱动,拖着左指针向前走。右指针每次只移动一步,而左指针在内部 while 循环中每次可能移动多步。右指针是主动前移,探索未知的新区域;左指针是被迫移动,负责寻找满足题意的区间。模板的整体思想是:模板中为什么不把 dict 放在 while 循环内部呢?因为如果放在 while原创 2021-05-14 09:12:43 · 2236 阅读 · 0 评论 -
LeetCode-题目详解:字符串
给你一个字符串 s,找到 s 中最长的回文子串。示例 1:示例 2:示例 3:示例 4:提示:原创 2021-05-27 23:32:47 · 749 阅读 · 0 评论 -
LeetCode-题目详解(三):二分查找法【 O(logn)】
给定两个大小分别为 m 和 n 的正序(从小到大)数组 nums1 和 nums2。请你找出并返回这两个正序数组的 中位数 。示例 1:示例 2:示例 3:示例 4:示例 5:提示:方法一:二分查找【时间复杂度:O(log(m+n))O(log(m+n))O(log(m+n))】方法二:一般看到O(log())级别的,就先想二分,分而治之的那些思想。比如归并排序,快排……本题主要处理好边界问题,相对于思想,边界处理和代码技巧更重要方法三:https://leetcode-cn.com/pr原创 2021-05-13 22:42:15 · 1034 阅读 · 1 评论 -
LeetCode-题目详解(二):归并排序【时间:O(nlogn)、稳】、快速排序【二路快排、三路快排】、选择排序【时间:O(n^2)、不稳】、堆排序【时间:O(nlogn)、不稳】
以数组 intervals 表示若干个区间的集合,其中单个区间为 intervals[i] = [starti, endi] 。请你合并所有重叠的区间,并返回一个不重叠的区间数组,该数组需恰好覆盖输入中的所有区间。示例 1:示例 2:提示:179. 最大数给定一组非负整数 nums,重新排列每个数的顺序(每个数不可拆分)使之组成一个最大的整数。注意:输出结果可能非常大,所以你需要返回一个字符串而不是整数。示例 1:示例 2:示例 3:示例 4:提示:方法一:选择排序方法二:快速排序方法三原创 2021-05-27 23:31:01 · 492 阅读 · 0 评论 -
LeetCode-题目详解(十):递归【深度优先遍历(DFS;前序遍历、中序遍历、后序遍历)】【岛屿问题、水域问题、单词搜索问题】、【广度优先遍历(BFS;借助queue结构)】
对于递归要分清以下概念:在 LeetCode 中,「岛屿问题」是一个系列系列问题,比如:L200. 岛屿数量 (Easy)463. 岛屿的周长 (Easy)695. 岛屿的最大面积 (Medium)827. 最大人工岛 (Hard)我们所熟悉的 DFS(深度优先搜索)问题通常是在树或者图结构上进行的。而我们今天要讨论的 DFS 问题,是在一种「网格」结构中进行的。岛屿问题是这类网格 DFS 问题的典型代表。网格结构遍历起来要比二叉树复杂一些,如果没有掌握一定的方法,DFS 代码容易写得冗长繁杂。本文将原创 2021-05-27 23:38:19 · 425 阅读 · 1 评论 -
LeetCode-题目详解:深度优先搜索、广度优先遍历
一、高频题1、高频题1.1、105-从前序与中序遍历序列构造二叉树1.2、131-分割回文串1.3、200-岛屿数量1.4、124-二叉树中的最大路径和1.5、394-字符串解码1.6、199-二叉树的右视图1.7、17-电话号码的字母组合1.8、104-二叉树的最大深度1.9、101-对称二叉树1.10、679-24 点游戏1.11、98-验证二叉搜索树1.12、721-账户合并1.13、257-二叉树的所有路径1.14、剑指 Offer 34-二叉树中和为某一值的路径1.原创 2021-05-27 23:36:09 · 1687 阅读 · 0 评论 -
LeetCode-题目详解(八):哈希表【Python:dict = {}】【C++:unordered_map<int, int> map】
我们同样也可以在遍历数组 nums 时候使用打擂台的方法,维护最大的值,这样省去了最后对哈希映射的遍历。给你一个整数数组 nums 和一个整数 k ,判断数组中是否存在两个 不同的索引 i 和 j ,满足 nums[i] == nums[j] 且 abs(i - j)原创 2021-05-13 22:57:50 · 305 阅读 · 1 评论 -
LeetCode-题目详解(七):栈【Stack】、队列【Queue】、堆【python(默认小根堆):heap、C++(默认大根堆):priority_queue】【单调递增、递减栈】【单调队列】
给定一个只包括 ‘(’,‘)’,‘{’,‘}’,‘[’,‘]’ 的字符串 s ,判断字符串是否有效。有效字符串需满足:示例 1:示例 2:示例 3:示例 4:示例 5:提示:1原创 2021-05-27 23:34:12 · 661 阅读 · 1 评论 -
LeetCode-题目详解(一):数组
给定一个整数数组 nums 和一个整数目标值 target,请你在该数组中找出 和为目标值 的那 两个 整数,并返回它们的数组下标。你可以假设每种输入只会对应一个答案。但是,数组中同一个元素在答案里不能重复出现。你可以按任意顺序返回答案。示例 1:示例 2:示例 3:提示:方法一:暴力枚举【O(N2)O(N^2)O(N2),其中 N 是数组中的元素数量】方法二:哈希表【O(N),其中 N 是数组中的元素数量】方法三:哈希表【O(N),其中 N 是数组中的元素数量】剑指 Offer 03. 数组中原创 2021-05-27 23:32:00 · 1706 阅读 · 0 评论 -
LeetCode-题目详解(六):链表【链表的中间节点:左半链表的结尾节点】【slow = head | fast = head | while fast and fast.next】
当「乌龟」和「兔子」从链表上的同一个节点开始移动时,如果该链表中没有环,那么「兔子」将一直处于「乌龟」的前方;链表具有天然的递归性,一个链表例如 1->2->3->4->5->NULL ,可以看成头节点(节点值为 1 的节点)后面挂接一个更短的链表(缺少节点值为 1 的节点,以节点值为 2 的节点为头节点) 1->更短的链表,依次类推。这样以来,我们首先使用哈希表进行定位,找出缓存项在双向链表中的位置,随后将其移动到双向链表的头部,即可在 O(1) 的时间内完成 get 或者 put 操作。原创 2021-05-27 23:33:25 · 2103 阅读 · 1 评论 -
LeetCode-题目详解(五):二叉搜索树【遍历、验证、属性、修改、构造、插入节点、删除节点、修剪】
遇到二叉搜索树,立刻想到这句话:「二叉搜索树(BST)的中序遍历是有序的」。这是解决所有二叉搜索树问题的关键。给定一个二叉树,判断其是否是一个有效的二叉搜索树。假设一个二叉搜索树具有如下特征:示例 1:示例 2:方法一:递归方法方法二:中序递归遍历(判断节点的有序性)方法三:中序递归遍历(转为有序数组)思路简单:将中序遍历的值一个个存入一个list中。理解二叉搜索树后,明白二叉搜索树中序遍历后是个递增序列。最后判断list是否为一个递增序列即可。255. 验证前序遍历序列二叉搜索树原创 2021-05-27 23:37:51 · 409 阅读 · 1 评论 -
算法-排序算法:概述
十种常见排序算法可以分为两大类:- **比较类排序**:通过比较来决定元素间的相对次序,由于其时间复杂度不能突破O(nlog2n),因此也称为非线性时间比较类排序。- **非比较类排序**:不通过比较来决定元素间的相对次序,它可以突破基于比较排序的时间下界,以线性时间运行,因此也称为线性时间非比较类排序。 相关概念:- **稳定**:如果a原本在b前面,而a=b,排序之后a仍然在b的前面。- **不稳定**:如果a原本在b的前面,而a=b,排序之后 a 可能会出现在 b 的...原创 2020-10-26 23:17:46 · 320 阅读 · 0 评论 -
算法-排序算法:选择排序O(n^2)【当遍历到第3个元素时,则排序后第3个元素肯定是全局排名第3的元素】、插入排序O(n^2)【当遍历到第3个元素时,则排序后第3个元素是前3个元素中排名第3的元素】
一、选择排序(Selection Sort)O(n2)选择排序(Selection sort)是一种简单直观的排序算法。它的工作原理如下。首先在未排序序列中找到最小(大)元素,存放到排序序列的起始位置,然后,再从剩余未排序元素中继续寻找最小(大)元素,然后放到已排序序列的末尾。以此类推,直到所有元素均排序完毕。选择排序的主要优点与数据移动有关。如果某个元素位于正确的最终位置上,则它不会被移动。选择排序每次交换一对元素,它们当中至少有一个将被移到其最终位置上,因此对n个元素的表进行排序总共进行至多n原创 2021-05-02 21:33:42 · 139 阅读 · 0 评论 -
算法-排序算法:冒泡排序(BubbleSort )【O(n^2)】【经典但是排序思路在生活中并不常用】
冒泡排序(英语:Bubble Sort)是一种简单的排序算法。它重复地遍历要排序的数列,一次比较两个元素,如果他们的顺序错误就把他们交换过来。遍历数列的工作是重复地进行直到没有再需要交换,也就是说该数列已经排序完成。这个算法的名字由来是因为越小的元素会经由交换慢慢“浮”到数列的顶端。一、冒泡排序算法的运作机理比较相邻的元素。如果第一个比第二个大(升序),就交换他们两个。对每一对相邻元素作同样的工作,从开始第一对到结尾的最后一对。这步做完后,最后的元素会是最大的数。针对所有的元素重复以上的步骤,除了原创 2021-05-04 21:07:30 · 238 阅读 · 0 评论 -
算法-排序算法:归并排序(Merge Sort)【O(nlogn)】【自顶向下:递归方式;自底向上:非递归方式】【稳定;最坏/最优时间复杂度:O(nlogn);空间复杂度:O(n)】
归并排序(Merge Sort):建立在归并操作上的一种有效的排序算法。该算法是采用分治法(Divide and Conquer)的一个非常典型的应用。将已有序的子序列合并,得到完全有序的序列;即先使每个子序列有序,再使子序列段间有序。若将两个有序表合并成一个有序表,称为2-路归并。一、归并排序-算法描述:把长度为n的输入序列分成两个长度为n/2的子序列;对这两个子序列分别采用归并排序;将两个排序好的子序列合并成一个最终的排序序列;归并的过程无法原地完成;二、归并排序-过程分析每2组合并原创 2021-05-02 21:39:47 · 811 阅读 · 1 评论 -
算法-排序算法:快速排序(QuickSort )【O(nlogn)】【单路:随机化无法避免元素全相等时退化为O(n^2)】、【双路+随机化:元素全相等时退化概率极低】【三路:元素全相等时为O(n)】
4、快速排序(Quick Sort)O(nlogn)快速排序(Quick Sort)的基本思想:通过一趟排序将待排记录分隔成独立的两部分,其中一部分记录的关键字均比另一部分的关键字小,则可分别对这两部分记录继续进行排序,以达到整个序列有序。2.1 快速排序-算法描述:快速排序使用分治法来把一个串(list)分为两个子串(sub-lists)。具体算法描述如下:从数列中挑出一个元素,称为 “基准”(pivot);重新排序数列,所有元素比基准值小的摆放在基准前面,所有元素比基准值大的摆在基准的后原创 2021-05-02 21:41:04 · 1446 阅读 · 0 评论 -
算法-排序算法:堆排序(HeapSort )【O(nlogn)】
MyArray.java/** * 数组 * * @author * @version 2018/8/4 */public class MyArray<E> { private E[] arr; private int size; public MyArray(int capacity){ arr = (E[])new Object[capacity]; size = 0; } public MyArray() { this(10); } publ原创 2021-05-04 16:56:33 · 131 阅读 · 0 评论 -
算法-排序算法:希尔排序(Shell Sort)【O(n^2)】
希尔排序(Shell Sort):1959年Shell发明,第一个突破O(n2)的排序算法,是插入排序的改进版。它与插入排序的不同之处在于,它会优先比较距离较远的元素。希尔排序又叫缩小增量排序。一、希尔排序-算法描述:先将整个待排序的序列A按照一个“增量”(gap)分割成为若干子序列,然后分别进行直接插入排序,具体算法描述:选择一个增量序列(gap 序列) t1,t2,…,ti,tj,…,1{t_1, t_2, …, t_i, t_j, …,1}t1,t2,…,ti,tj,…,1,其中ti&原创 2021-05-04 21:10:05 · 330 阅读 · 0 评论 -
算法-搜索算法:二分查找(Binary Search)【前置条件:待查数据集必须是有序结构,可以右重复元素】【时间复杂度:O(logn)】
>**搜索**:是在一个项目集合中找到一个特定项目的算法过程。搜索通常的答案是真的或假的,因为该项目是否存在。 搜索的几种常见方法:顺序查找、二分法查找、二叉树查找、哈希查找# 一、二分法查找>**二分查找**又称折半查找,优点是比较次数少,查找速度快,平均性能好;缺点是要求待查表①必须采用顺序存储结构 ②必须按关键字大小有序排列,且插入删除困难。因此,折半查找方法适用于不经常变动而查找频繁的有序列表。- 首先,假设表中元素是按升序排列,将表中间位置记录的关键字与查找关键字比较,如果两者相等,则查原创 2020-10-27 00:32:11 · 1243 阅读 · 0 评论 -
算法-五大常用算法:贪心算法(Greedy Algorithm)
顾名思义,贪心算法总是作出在当前看来最好的选择。也就是说贪心算法并不从整体最优考虑,它所作出的选择只是在某种意义上的局部最优选择。当然,希望贪心算法得到的最终结果也是整体最优的。虽然贪心算法不能对所有问题都得到整体最优解,但对许多问题它能产生整体最优解。如单源最短路经问题,最小生成树问题等。在一些情况下,即使贪心算法不能得到整体最优解,其最终结果却是最优解的很好近似。从问题的某一个初始解出发逐步逼近给定的目标,以尽可能快的地求得更好的解。当达到算法中的某一步不能再继续前进时,算法停止。该算法存在问题:不能保原创 2021-02-03 23:33:04 · 655 阅读 · 0 评论 -
算法-五大常用算法:回溯算法
数据结构与算法-五大常用算法:回溯算法原创 2021-02-27 22:15:16 · 164 阅读 · 0 评论 -
算法-五大常用算法:动态规划(DP)算法【先求解小数据量下问题的结果,然后层层递推,求解更大的数据量的问题的结果】【维特比算法(Viterbi Algorithm)属于动态规划算法】
动态规划过程是:每次决策依赖于当前状态,又随即引起状态的转移。一个决策序列就是在变化的状态中产生出来的,所以,这种多阶段最优化决策解决问题的过程就称为动态规划。基本思想与分治法类似,也是将待求解的问题分解为若干个子问题(阶段),按顺序求解子阶段,前一子问题的解,为后一子问题的求解提供了有用的信息。在求解任一子问题时,列出各种可能的局部解,通过决策保留那些有可能达到最优的局部解,丢弃其他局部解。依次解决各子问题,最后一个子问题就是初始问题的解。由于动态规划解决的问题多数有重叠子问题这个特点,为减少重复计算,对原创 2021-02-03 23:30:24 · 2083 阅读 · 0 评论 -
算法-五大常用算法:分治算法(Divide-and-Conquer)
分治法,字面意思是“分而治之”,就是把一个复杂的1问题分成两个或多个相同或相似的子问题,再把子问题分成更小的子问题直到最后子问题可以简单地直接求解,原问题的解即子问题的解的合并,这个思想是很多高效算法的基础,例如排序算法(快速排序,归并排序),傅里叶变换(快速傅里叶变换)等。分治法的基本思想:将一个难以直接解决的大问题,分割成一些规模较小的相同问题,以便各个击破,分而治之。分治策略:对于一个规模为n的问题,若该问题可以容易的解决(比如规模n较小)则直接解决,否则将其分解为k个规模较小的子问题,这些子问题互相原创 2021-02-28 22:08:46 · 1030 阅读 · 0 评论 -
算法-五大常用算法:分支限界算法
分支限界算法:类似于回溯法,也是一种在问题的解空间树T上搜索问题解的算法。但在一般情况下,分支限界法与回溯法的求解目标不同。回溯法的求解目标是找出解空间树中满足约束条件的所有解,而分支限界法的求解目标则是满足约束条件的一个解,或是从满足约束条件的解中找出使某一目标函数值达到极大或极小的解,即在某种意义下的最优解。分支限界法的基本思想是对有约束条件的最优化问题的所有可行解(数目有限)空间进行搜索。该算法在具体执行时,把全部可行的解空间不断分割为越来越小的自己(成为分支),并为每个自己内的解的值计算一个下界或上原创 2021-02-27 22:14:31 · 180 阅读 · 0 评论 -
数据结构:概述
线性结构:数据结构中的元素存在一对一的相互关系,表中各个结点具有线性关系;非线性结构内存是以字节为基本存储单位的(1024b = 1kb) , 每个基本存储空间都有自己的地址。整形(int) : 占 4个字节字符(char): 占1个字节 . 单个字符“a”占1个字节, 字符串“abc”占3个字节...原创 2021-05-01 14:46:15 · 133 阅读 · 0 评论 -
数据结构-线性结构:动态数组(顺序表)【底层依托“静态数组”】【靠resize解决固定容量问题】
一、动态数组的基本原理实现一个基本的动态数组,需要实现一些基本的功能,增删改查应该是最基本的了,而在此基础之上还需要实现相应的动态扩容与泛型。对于动态扩容来说,我们需要在数组的使用过程中来进行判断,是否需要进行扩容,以及如何更有效的进行扩容,添加长度还是重新申请。而泛型的实现就需要数组能够接受任何类型的数据。二、动态扩容实现动态扩容的方式有很多,但是在数组的后面接上一段内存是明显不行的,我们需要做的就是重新申请一个更大容量的数组,这样才是可行的方法,但是问题又来了用什么方式来申请才能够最有效的扩容,我原创 2021-05-01 14:29:06 · 659 阅读 · 0 评论 -
数据结构-线性结构:链表(Linked List)【基于自定义Node节点】【真正的动态数据结构,不需要处理固定容量问题】【最简单的动态数据结构】【单向链表、单向循环链表、双向链表、双向循环链表】
数据结构1、定义在计算机科学中,数据结构是一种数据组织、管理和存储的格式,它可以帮助我们实现对数据高效的访问和修改。更准确地说,数据结构是指相互之间存在一种或多种特定关系的数据元素的集合,可以体现数据值之间的关系,以及可以对数据进行应用的函数或操作。通常情况下,精心选择的数据结构可以带来更高的运行或者存储效率 , 数据结构往往同高效的算法有关通俗点来说,在针对一些非数值计算的问题,我们需要数组,链表,树,图等数据结构来帮助我们解决它们。它是一个集合,里面包含了互相之间存在各种关系的数据元素。原创 2020-10-25 23:12:02 · 438 阅读 · 0 评论 -
数据结构-线性结构:栈(Stack)【底层依托“动态数组”/“链表”】【“栈”的操作是“动态数组”操作的子集;“栈”只能同一端(称为“栈顶”)添加元素、取出元素;“后进先出”】
栈可以用顺序表(动态数组)(python中的list数据结构是一种顺序表(动态数组))实现,也可以用链表实现。基于“动态数组”的栈、基于“链表”的栈整体上时间复杂度基本一致;最多2~3倍的差异;绝不会出现几百倍的差异;java代码:MyStack.javaMyArray.javaMyArrayStack.javaMain.java输出结果:2、基于“链表”的栈MyStack.javaMyLinkedList.javaMyLinkedListStack.javaMain.java输出结果:原创 2021-05-01 14:52:17 · 668 阅读 · 2 评论 -
数据结构-线性结构:队列(Queue)【底层依托“动态数组”/“链表”】【“队列”的操作是“动态数组”操作的子集;队列只能一端(队尾)添加元素另一端(队首)取元素;“先进先出”】
java代码:MyQueue.javaMyArray.javaMyArrayQueue.javaMain.java输出结果:python代码:2、循环队列2.1 “循环队列”结构“循环队列”结构的目的就是弥补“数组队列”的dequeue()操作的复杂度O(n)的缺陷,使用“循环队列”结构后,dequeue()操作的复杂度为O(1)。java代码:MyQueue.javaMyArray.javaMyLoopQueue.javaMain.java输出结果:3、双端队列二、原创 2021-05-01 16:42:13 · 666 阅读 · 2 评论 -
数据结构-线性结构:哈希表
6、哈希表/散列表(Hash Table)哈希表,也叫散列表(Hash table),是根据键(Key)而直接访问在内存储存位置的数据结构。也就是说,它通过一个关于键值的函数(哈希函数)将所需查询的数据映射到表中一个位置来访问记录,这加快了查找速度。这个映射函数称做哈希函数,存放记录的数组称做哈希表。哈希表是能够通过给定的关键字的值直接访问到具体对应的值的一个数据结构。把关键字映射到一个表中的位置来直接访问记录,以加快访问速度。通常,我们把这个关键字称为 Key,把对应的记录称为 Value,所以原创 2021-05-01 14:53:12 · 537 阅读 · 0 评论 -
数据结构-非线性结构:树形结构概述
树(英语:tree)是一种抽象数据类型(ADT)或是实作这种抽象数据类型的数据结构,用来模拟具有树状结构性质的数据集合。它是由n(n>=1)个有限节点组成一个具有层次关系的集合。把它叫做“树”是因为它看起来像一棵倒挂的树,也就是说它是根朝上,而叶朝下的。树具有以下的特点:将数据结构存储在固定的数组中,然在遍历速度上有一定的优势,但因所占空间比较大,是非主流二叉树。二叉树通常以链式存储。由于对节点的个数无法掌握,常见树的存储表示都转换成二叉树进行处理,子节点个数最多为2。...原创 2021-04-30 18:42:33 · 978 阅读 · 1 评论 -
数据结构-非线性结构-树形结构:有序树 ---->二叉树【动态数据结构】
二叉树是每个节点最多有两个子树的树结构。通常子树被称作“左子树”(left subtree)和“右子树”(right subtree)排序二叉树(BST)的要求:顺序存储:将数据结构存储在固定的数组中,虽然在遍历速度上有一定的优势,但因所占空间比较大,是非主流二叉树存储方式.二叉树通常以链式存储。链式存储:由于对节点的个数无法掌握,常见树的存储表示都转换成二叉树进行处理,子节点个数最多为2。五、二叉树的遍历1、广度优先遍历2、深度优先遍历三种深度优先遍历方式:...原创 2021-05-03 20:30:52 · 1631 阅读 · 0 评论 -
数据结构-非线性结构-树形结构:有序树 ---->二叉树 ----> 深度优先遍历【模板】
给定一棵二叉树,你需要计算它的直径长度。一棵二叉树的直径长度是任意两个结点路径长度中的最大值。这条路径可能穿过也可能不穿过根结点。示例 :给定二叉树返回 3, 它的长度是路径 [4,2,1,3] 或者 [5,2,1,3]。注意:两结点之间的路径长度是以它们之间边的数目表示。...原创 2021-05-20 20:31:02 · 81 阅读 · 0 评论 -
数据结构-非线性结构-树形结构:有序树 ->二叉树 -> 二叉搜索树(二分搜索树)【动态数据结构;不一定是满二叉树;不一定是平衡二叉树】【二分搜索树:中序遍历是递增序列;前序遍历是先降序,后升序】
二叉树是每个节点最多有两个子树的树结构。通常子树被称作“左子树”(left subtree)和“右子树”(right subtree)二分搜索树(排序二叉树(英语:Binary Search Tree),也称二叉搜索树、二叉查找树、有序二叉树),排序二叉树包含空树。二分搜索树(BST)的要求:二分搜索树种存储的元素必须是可比较的,链表、数组不需要存储的元素必须是可比较的。最自然、最常用的遍历方式后续遍历的一个应用:为二分搜索树释放内存广度优先遍历的意义:更快地找到问题的解。常用于算法设计中-最短路原创 2021-05-03 19:30:41 · 266 阅读 · 0 评论 -
数据结构-非线性结构-树形结构:有序树 ->二叉树 -> 平衡二叉树(任何节点的左右子树的高度差不大于1)-> 完全二叉树(除最底层外的其他层都被填满,且最底层左到右填入) -> 堆(优先队列)
完全二叉树:即除了最底层,其他层的节点都被元素填满,且最底层左到右填入。完全二叉树属于平衡二叉树。堆是一种完全二叉树,且满足以下条件:我们对堆中的结点按层进行编号,可以将堆逻辑结构映射到数组中add、extractMax操作的时间复杂度都是 O(logn)O(logn)O(logn)由上图可知,二叉堆可以用动态数组来实现。MyArray.java1、最大堆MaxHeap.java2、最小堆MinHeap.java三、heapify:将任意数组整理成堆的形状Queue.javaPrio原创 2021-05-03 19:35:15 · 603 阅读 · 2 评论 -
数据结构-非线性结构-树形结构:有序树 ->二叉树 ->平衡二叉树(任何节点的左右子树的高度差不大于1)-> AVL树【O(logn)】【二分搜索树&平衡二叉树】【旋转类型:LL/RR/LR/RL】
平衡二叉树(AVL树):当且仅当任何节点的两棵子树的高度差不大于1的二叉树;AVL树是二分搜索树的改进版,防止二分搜索树在一些情况下退化为链表。AVL树最大高度: lognlognlognFileOperation.javaMain.java...原创 2021-05-03 19:31:46 · 356 阅读 · 0 评论