
数据结构与算法
文章平均质量分 60
数据结构与算法
小馋喵星人
这个作者很懒,什么都没留下…
展开
-
【LeetCode #22 题解】 括号生成,四种解法(深度优先遍历算法、广度优先遍历算法、动态规划法)
【LeetCode #22 题解】 括号生成(深度优先遍历算法、广度优先遍历算法)* 题目1. 深度优先遍历算法实现 - 系统栈递归2. 深度优先遍历算法实现 - 栈3. 广度优先遍历算法实现 - 队列* 题目数字 n 代表生成括号的对数,请你设计一个函数,用于能够生成所有可能的并且 有效的 括号组合。示例 :输入:n = 3输出:["((()))","(()())","(())()","()(())","()()()"]1. 深度优先遍历算法实现 - 系统栈递归class Solutio原创 2021-02-25 18:03:24 · 525 阅读 · 0 评论 -
【经典算法实现 48】找出一个数组中分别为奇数个的数
先来说下题目:一个数组中存在两个数a和ba 和 ba和b,且a、ba、ba、b中个数一个为偶数一个为奇数,请使用两种方法分别找出它们。方法一: 找奇数个的数。思路:利用 a^a=0公式,直接把所有的数都异或一遍,最后留下来的就是奇数个的数。int find_odd_num(int *arr){ int result = 0, *p = arr; while(p != NULL){ result = result ^ *p; p++; } return result;}.原创 2021-02-10 12:58:37 · 704 阅读 · 0 评论 -
【LeetCode #47 题解】 带重复全排列 II(递归回溯法、非递归实现)
【LeetCode #47 题解】 带重复排列 II(递归回朔法、非递归实现)题目:题解一:非递归实现题解二:递归回朔法题目:题目链接: 《带重复排列 II》给定一个可包含重复数字的序列,返回所有不重复的全排列。示例:输入: [1,1,2]输出:[ [1,1,2], [1,2,1], [2,1,1]]题解一:非递归实现本题解思路主要如下:先对数组进行 从小到大排序。接着对它不停的求下排列,直到找不到下一排列为止。class Solution {public:原创 2020-10-25 12:31:21 · 467 阅读 · 0 评论 -
【LeetCode #46 题解】 全排列(递归回朔法、非递归实现)
【LeetCode #46 题解】 全排列(递归回朔法、深度遍历算法)题目题解一、递归回朔法题解二、Stack栈+深度遍历算法(非递归)题目给定一个 没有重复 数字的序列,返回其所有可能的全排列。示例:输入: [1,2,3]输出:[ [1,2,3], [1,3,2], [2,1,3], [2,3,1], [3,1,2], [3,2,1]]题解一、递归回朔法类似 树的中序遍历方法。命令行打印输出结果,和上面推导一样,我画成树后,如下: 交换 1原创 2020-10-15 18:21:09 · 645 阅读 · 0 评论 -
【LeetCode #31 题解】 下一个排列
题目题目链接:《31. 下一个排列》实现获取下一个排列的函数,算法需要将给定数字序列重新排列成字典序中下一个更大的排列。如果不存在下一个更大的排列,则将数字重新排列成最小的排列(即升序排列)。必须原地修改,只允许使用额外常数空间。以下是一些例子,输入位于左侧列,其相应输出位于右侧列。1,2,3 → 1,3,23,2,1 → 1,2,31,1,5 → 1,5,1分析思路这个题可以转换为,寻找下一个比它更大的数。例如,以 [1,5,8,4,7,6,5,3,1][ 1,5,8,4,7,6,5原创 2020-10-15 15:29:59 · 508 阅读 · 0 评论 -
【LeetCode】 高效算法刷题思路、算法题目分类 - 持续更新
刷 LeetCode 上的算法题对于掌握算法还是非常有在帮助的,但上面的题目太多太杂,如果不做以归类,有目的性的刷题,最终肯定会有些心得,但同时也会浪费大量的时间。但作为一个没刷多少题的 LeetCode 新手小白来说,对题目分类有点虚了。本文是参考网上已有的 LeetCode 高手,并且结合自身的情况,进行归整,希望归整出一份从㳀入深,适合自已的高效刷题方法。好,我们开始吧^_^算法分类1. 排序算法 2. 双指针 3. 字符串 4. 位运算原创 2020-10-15 11:22:00 · 3419 阅读 · 0 评论 -
【LeetCode #20 题解】 有效的括号(栈实现)
一、题目给定一个只包括'(',')','{','}','[',']' 的字符串,判断字符串是否有效。有效字符串需满足:左括号必须用相同类型的右括号闭合。左括号必须以正确的顺序闭合。注意空字符串可被认为是有效字符串。示例:输入: "()" 输出: true输入: "()[]{}" 输出: true输入: "(]" 输出: false输入: "([)]" 输出: false输入: "{[]}" 输出: true代码实现:bool isValid(char原创 2020-09-29 18:29:18 · 286 阅读 · 0 评论 -
【LeetCode #19 题解】 删除链表的倒数第N个节点(快慢指针实现)
一、题目 & 题解给定一个链表,删除链表的倒数第 n 个节点,并且返回链表的头结点。示例:给定一个链表: 1->2->3->4->5, 和 n = 2.当删除了倒数第二个节点后,链表变为 1->2->3->5.说明: 给定的 n 保证是有效的。代码如下:/** * Definition for singly-linked list. * struct ListNode { * int val; * struct L原创 2020-09-29 17:26:20 · 323 阅读 · 0 评论 -
【LeetCode #18 题解】 四数之和
一、题目给定一个包含 nnn 个整数的数组 numsnumsnums 和一个目标值 targettargettarget,判断 numsnumsnums 中是否存在四个元素 a,b,c和da,b,c 和 da,b,c和d ,使得 a+b+c+da + b + c + da+b+c+d 的值与 targettargettarget 相等?找出所有满足条件且不重复的四元组。注意:答案中不可以包含重复的四元组。示例:给定数组 nums = [1, 0, -1, 0, -2, 2],和 target原创 2020-09-27 21:59:01 · 360 阅读 · 0 评论 -
【LeetCode #17 题解】 电话号码的字母组合
一、题目给定一个仅包含数字 2-9 的字符串,返回所有它能表示的字母组合。给出数字到字母的映射如下(与电话按键相同)。注意 1 不对应任何字母。示例:输入:"23"输出:["ad", "ae", "af", "bd", "be", "bf", "cd", "ce", "cf"].二、题解解题思路:以 273 为例,其结果为:["apd","ape","apf","aqd","aqe","aqf","ard","are","arf","asd","ase","asf", "bpd",原创 2020-09-24 11:29:20 · 382 阅读 · 0 评论 -
【经典算法实现 47】任意尺寸彩色BMP图像 的 FFT变换及 IFFT逆变换(C语言)
【经典算法实现 47】任意尺寸彩色BMP图像 的 FFT变换及 IFFT逆变换(C语言)一、代码实现二、运行结果在前文《【经典算法实现 46】任意尺寸BMP图像 的 FFT变换及 IFFT逆变换(C语言)》中我们实现了bmp图像的FFTFFTFFT及IFFTIFFTIFFT 变换,但美中不足的是它变换后的颜色总是灰白的,很不美观。今天, 我们来给它优化成支持彩色图像 的 FFT变换及 IFFT逆变换。本文链接《【经典算法实现 47】任意尺寸彩色BMP图像 的 FFT变换及 IFFT逆变换(C语言)》原创 2020-09-11 17:46:38 · 1380 阅读 · 2 评论 -
【经典算法实现 46】任意尺寸BMP图像 的 FFT变换及 IFFT逆变换(C语言)
【经典算法实现 46】C语言实现 任意尺寸BMP图像 的 FFT变换及 IFFT逆变换一、优化非2n2^n2n尺寸图片自动填零后再做傅里叶变换在前文中,我们实现了BMP图片的 傅里叶 FFT 及 IFFT 变换代码。《【经典算法实现 45】C语言实现BMP图像的FFT快速傅里叶变换及 IFFT逆变换》本文主要是实现优化任意尺寸图片(非2n2^n2n 图片)均可进行填000变换一、优化非2n2^n2n尺寸图片自动填零后再做傅里叶变换#include <stdio.h>#inclu原创 2020-09-11 11:45:24 · 1111 阅读 · 0 评论 -
【经典算法实现 45】BMP图像的FFT快速傅里叶变换及 IFFT逆变换(C语言)
【经典算法实现 45】C语言实现图像的FFT快速傅里叶变换及 IFFT逆变换一、图像的FFT快速傅里叶变换及 IFFT逆变换 代码二、运行结果2.1 《test_少司命_256.bmp》2.2 《test_长方形.bmp》2.3 《test_正方形.bmp》2.4 《test_圆形.bmp》2.5 《test_三角形.bmp》2.6 《test_三角形&圆形.bmp》在前文《【经典算法实现 44】理解二维FFT快速傅里叶变换 及 IFFT快速傅里叶逆变换(迭代法 和 递归法)》中,我们实现了二原创 2020-09-10 18:52:36 · 2754 阅读 · 13 评论 -
【经典算法实现 44】理解二维FFT快速傅里叶变换 及 IFFT快速傅里叶逆变换(迭代法 和 递归法)
【经典算法实现 44】理解二维FFT快速傅里叶变换 及 IFFT快速傅里叶逆变换(迭代法 和 递归法)一、二维FFTFFTFFT快速傅里叶变换 公式推导二、二维FFTFFTFFT 及 IFFTIFFTIFFT代码实现(迭代法)前面我们实现了一维快速傅里叶变换《【经典算法实现 43】理解FFT快速傅里叶变换 及 IFFT快速傅里叶逆变换(迭代法 和 递归法)》本文开始二维傅里叶变换的公式推导及代码实现一、二维FFTFFTFFT快速傅里叶变换 公式推导二维傅里叶变换:F(u,v)=∑Mx=0Mx原创 2020-09-09 23:39:55 · 12772 阅读 · 1 评论 -
【经典算法实现 43】理解FFT快速傅里叶变换 及 IFFT快速傅里叶逆变换(迭代法 和 递归法)
【经典算法实现 43】理解FFT快速傅里叶变换一、FFT公式推导二、图示求解过程(分治法)2.1 第一次奇偶分组 z = 22.2 第二次奇偶分组 z = 12.3 第三次奇偶分组 z = 0三、图示求解过程(递归法)3.1 第一次递归 z = 33.2 第二次递归 z = 23.3 第三次递归 z = 13.4 第四次递归 z = 0四、代码实现(递归法)五、代码实现(分治法)一、FFT公式推导一维傅里叶变换:F(u)=∑M=0M−1f(x)e−jux2πM,u=0,1,2,⋯ ,M−1F(u)原创 2020-09-09 12:45:01 · 2921 阅读 · 1 评论 -
【经典算法实现 42】二维傅里叶变换 及 逆变换代码实现
【经典算法实现 42】一维傅里叶变换 及 逆变换代码实现二维傅里叶变换:F(u,v)=∑M=0M−1f(x,y)e−j(ux+vy)2πM,u=0,1,2,⋯ ,M−1F(u,v) = \sum_{M=0}^{M-1} f(x,y) e^{-j (ux+vy) \frac{2\pi} M}, u=0,1,2,\cdots,M-1F(u,v)=M=0∑M−1f(x,y)e−j(ux+vy)M2π,u=0,1,2,⋯,M−1二维傅里叶逆变换:f(x,y)=1M∑u=0M−1F(u,v)ej(ux+原创 2020-09-07 17:12:06 · 2810 阅读 · 3 评论 -
【经典算法实现 41】一维傅里叶变换及逆变换 代码优化
@[toc](【经典算法实现 40】一维傅里叶变换 及 逆变换O(n)O(n)O(n) 代码优化)原创 2020-09-07 11:21:31 · 958 阅读 · 0 评论 -
【经典算法实现 40】一维傅里叶变换 及 逆变换代码实现
【经典算法实现 40】一维傅里叶变换 及 逆变换代码实现一、一维傅里叶变换 及 其逆变换二、C代码实现一、一维傅里叶变换 及 其逆变换一维傅里叶变换:F(u)=∑M=0M−1f(x)e−jux2πM,u=0,1,2,⋯ ,M−1F(u) = \sum_{M=0}^{M-1} f(x) e^{-j u x \frac{2\pi} M}, u=0,1,2,\cdots,M-1F(u)=M=0∑M−1f(x)e−juxM2π,u=0,1,2,⋯,M−1一维傅里叶逆变换:f(x)=1M∑u=0M−1原创 2020-09-02 12:31:50 · 2456 阅读 · 2 评论 -
十分简明易懂的FFT(快速傅里叶变换)
十分简明易懂的FFT(快速傅里叶变换)一、多项式的系数表示法和点值表示法1.1 系数表示法1.2 点值表示法1.3 高精度乘法下两种多项式表示法的区别二、DFTDFTDFT 前置知识&技能2.1 复数2.2 复数的运算三、DFTDFTDFT (离散傅里叶变换)3.1 单位根的一些性质3.2 FFTFFTFFT (快速傅里叶变换)3.3 IFFTIFFTIFFT (快速傅里叶逆变换)四、朴素版FFT 代实现快速傅里叶变换 (fast Fourier transform),即利用计算机计算离散傅里叶转载 2020-09-01 15:39:29 · 3307 阅读 · 0 评论 -
傅里叶变换分析之掐死教程
《傅里叶级数与傅里叶变换》《傅里叶分析之掐死教程(完整版)更新于2014.06.06 - 知乎》转载 2020-09-01 10:48:19 · 653 阅读 · 0 评论 -
【经典算法实现 39】图的最短路径计算(优化Dijkstra算法支持负权计算 及 负环检测功能)(参考Bellman_Ford算法)
【经典算法实现 39】图的最短路径计算(优化Dijkstra算法支待负权计算及负环检测功能)(参考Bellman_Ford算法)一、核心算法实现二、运行结果:负权计算三、运行结果:带负环计算四、完整代码在前面《【经典算法实现 37】图的最短路径计算(Dijkstra迪杰斯特拉算法 及 其优化)》我们实现了 Dijkstra迪杰斯特拉算法 对正权值图的计算,本文参考 Bellman_Ford算法,实现对 Dijkstra迪杰斯特拉算法 的优化,让其支持:负权值计算负环检测 及 自动退出功能一原创 2020-08-27 14:21:28 · 715 阅读 · 0 评论 -
【经典算法实现 38】图的最短路径计算(Floyd弗洛伊德算法)
【经典算法实现 38】图的最短路径计算(Floyd弗洛伊德算法)一、Floyd弗洛伊德算法1. 算法思路2. Floyd 算法核心代码二、完整代码如下:2.1 运行结果本文接着前面的文章,继续探讨最短路径的问题《【经典算法实现 36】图的最短路径计算(广度优先遍历法 和 深度优先遍历法)》《【经典算法实现 37】图的最短路径计算(Dijkstra迪杰斯特拉算法 及 其优化)》今天,我们来看下,别一种计算最短路径的算法:Floyd弗洛伊德算法。老样子,先上图:一、Floyd弗洛伊德算法1.原创 2020-08-26 15:51:35 · 616 阅读 · 0 评论 -
【经典算法实现 37】图的最短路径计算(Dijkstra迪杰斯特拉算法 及 其优化)
【经典算法实现 37】图的最短路径计算(Dijkstra迪杰斯特拉算法)一、Dijkstra 迪杰斯特拉算法1. 算法思路2. 算法代码实现二、Dijkstra 迪杰斯特拉算法(优化为任意起点作起始点,计算所有能到达的点的最短路径)1. 算法思路(以节点D作起始点为例)2. 算法代码实现3. 运行结果(查找A到所有节点的最短距离)4. 运行结果(查找D到所有节点的最短距离)三、完整代码在前面《【经典算法实现 36】图的最短路径计算(广度优先遍历法 和 深度优先遍历法)》中,我们实现了在广度优先遍历 及 深原创 2020-08-26 14:24:02 · 808 阅读 · 0 评论 -
【经典算法实现 36】图的最短路径计算(广度优先遍历法 和 深度优先遍历法)
【经典算法实现 36】图的最短路径计算(广度优先遍历法 和 深度优先遍历法)一、最短路径算法1.1 通过广度 / 深度优先 实现思路1.2 广度优先遍历实现计算最短路径代码1.3 深度优先遍历实现计算最短路径代码本文接着前文,如果对网的创建、深度优先遍历算法或广度优先遍历算法 有疑问的同学,可参考下前文:《【经典算法实现 33】图的创建 — 有向邻接矩阵法 与 网》《【经典算法实现 34】带权有向邻接矩阵(网的遍历)— 深度优先遍历算法》《 【经典算法实现 35】带权有向邻接矩阵(网的遍历)— 广度原创 2020-08-25 15:33:07 · 5990 阅读 · 0 评论 -
【经典算法实现 35】带权有向邻接矩阵(网的遍历)--- 广度优先遍历算法
【经典算法实现 34】带权有向邻接矩阵(网的遍历)--- 广度优先遍历算法一、广度遍历算法(队列实现)1. 算法思路2. 网矩阵广度优先遍历算法在前面《【经典算法实现 33】图的创建 — 有向邻接矩阵法 与 网》中,我们实现了使用邻接矩阵法实现图的创建。在《【经典算法实现 34】带权有向邻接矩阵(网的遍历)— 深度优先遍历算法》中我们实现了网矩阵的深度优先遍历算法,本文,我们来研究下,网矩阵的广度优先遍历算法。废话不多说,先上图:一、广度遍历算法(队列实现)1. 算法思路我们先把前面代原创 2020-08-25 12:37:58 · 2015 阅读 · 0 评论 -
【经典算法实现 34】带权有向邻接矩阵(网的遍历)--- 深度优先遍历算法
【经典算法实现 34】带权有向邻接矩阵(网的遍历)--- 深度优先遍历算法一、深度遍历算法(栈实现)1. 算法思路2. 网矩阵深度遍历算法3. 运行结果二、完整代码在前面《【经典算法实现 33】图的创建 — 有向邻接矩阵法 与 网》中,我们实现了使用邻接矩阵法实现图的创建。由于有向邻接矩阵是网(带权有向邻接矩阵法)的简化版,所以我们此处来研究下网(带权有向邻接矩阵法)的深序遍历算法。废话不多说,先上图:一、深度遍历算法(栈实现)1. 算法思路我们先把前面代码中网的结果发下:网矩阵创建完原创 2020-08-25 12:13:16 · 3221 阅读 · 0 评论 -
【经典算法实现 33】图的创建 --- 有向邻接矩阵法 与 网
【经典算法实现 33】图的创建 --- 邻接矩阵一、有向邻接矩阵法1. 有向邻接矩阵代码实现2. 运行结果二、网 (带权有向邻接矩阵法)在前面《【经典算法实现 30】图的创建 — 十字链表法》 中我们实现了使用十字链表法创建图。还是把之前的那张图搬出来,今天,我们来学习下使用邻接矩阵法创建这幅图:一、有向邻接矩阵法无向邻接矩阵的二维边数组是一个对称矩阵,相对比较简单本章重点来讲下有向邻接矩阵。有向图的邻接矩阵,如下图所示,使用的是一个一维数组 和一个二维数组来表示。根据上图,因此我们原创 2020-08-25 10:40:28 · 2215 阅读 · 1 评论 -
【经典算法实现 32】图的遍历 --- 广度优先遍历算法
【经典算法实现 31】图的遍历 --- 广度优先遍历算法一、 广度优先遍历算法1.1 实现思路1.2 广度优先遍历算法代码实现二、完整代码2.1 运行结果本文接着《【经典算法实现 30】图的创建 — 十字链表法》,《【经典算法实现 31】图的遍历 — 深度优先遍历算法》本文,我们来实现图的广度优先遍历算法。先上图一、 广度优先遍历算法深度优先遍历算法 与 广度优先遍历算法 最大的区别在于,深度优先遍历算法 使用的栈,后进先出广度优先遍历算法 使用的是队列,先进先出1.1 实现原创 2020-08-24 22:03:22 · 3137 阅读 · 0 评论 -
【经典算法实现 31】图的遍历 --- 深度优先遍历算法
【经典算法实现 31】图的遍历 --- 深度优先法 与 广度优先法一、深度优先算法1.1 实现思路1.2 栈代码实现1.3 深度优先算法代码实现二、完整代码实现2.1 运行结果本文接着《【经典算法实现 30】图的创建 — 十字链表法》,在它的基础上来实现 深度优先算法 与 广度优先算法。先上图一、深度优先算法1.1 实现思路假设提供的第一个节点就是A.通过A 找到B,将A 放入栈,此时栈内容为:A通过B 找到D,将B 放入栈,此时栈内容为:BA通过D 找到E,将D放入栈,此时栈内容原创 2020-08-24 21:33:48 · 2194 阅读 · 0 评论 -
【经典算法实现 30】图的创建 --- 十字链表法
【经典算法实现 30】十字链表实现图的保存一、十字链表法1.1 画出所有顶点1.2 画出所有的边1.3 完善边与顶点的出边关系1.4 完善边与顶点的入边关系二、十字链表代码实现之前写了这么多树的文章,本文要开始学习图了,先来随便画个图:问题来,如果要在C语言代码中保存这幅图,应该如何保存呢?本文主要目的,就是通过十字链表法来实现这幅图的保存 及 遍历。一、十字链表法我们先来画图,使用十字链表法,将前面的图画出来。1.1 画出所有顶点顶点结点的数据类型为// 顶点结构 typedef原创 2020-08-24 17:38:21 · 1044 阅读 · 1 评论 -
【经典算法实现 29】根据二叉树 中序 + 前序 遍历结果,计算出树 及 后序遍历结果
【经典算法实现 29】根据二叉树 中序遍历结果 + 前序遍历结果,计算原本树结构 及 其后序遍历结果一、获取一颗树的前序、中序、后序遍历结果1. 前序、中序、后序遍历代码二、题目:根据提供的前序、中序遍历结果,计算树及后续遍历结果2.1 分析思路2.2 核心代码实现2.3 完整代码2.4 运行结果一、获取一颗树的前序、中序、后序遍历结果在前面文章中《【经典算法实现 28】广度优先法 - 创建满二叉树 完整代码实现》,我们实现了创建一颗满二叉树,在其基础上,我们来获取下一颗树的前序、中序 、后序结果,作原创 2020-08-23 19:59:41 · 428 阅读 · 0 评论 -
【经典算法实现 28】广度优先法 - 创建满二叉树 完整代码实现
【经典算法实现 28】广度优优先 - 创建满二叉树 完整代码实现一、广度优先算法思路二、循环队列实现2.1 循环队列测试代码运行结果三、广度优优先算法 - 创建满二叉树3.1 算法实现3.2 完整代码 (带详细注释)3.3 运行结果一、广度优先算法思路创建根节点 A将A 放入队列,此是队列中数据为 A从 队列取出A,判断 A 是否有左节点,如果没有就创建B,然后将 B 放入队列中 ,此时队列数据为 B判断 A 是否有右节点,如果没有就创建C,然后将 C 放入队列中,此时 队列数据为 B C原创 2020-08-23 13:14:24 · 1216 阅读 · 0 评论 -
【经典算法实现 27】乱序数组 实现创建 有序二叉树
【经典算法实现 27】乱序数组 实现创建 有序二叉树在前面文章中,我们实现了二叉树的创建,二叉树的平衡等问题的处理,本文,我们来实现一下在不排序的情况下,实现对乱序数组创建有序二叉树。先说明下,本文中,所谓的有序二叉树是指,中续遍历时有序的二叉树,如下图,中续遍历结果为: 3-4-5-6-7-8-9-10-11好,开始写代码吧!// 乱序数组 实现创建有序二叉树 #include <stdio.h>typedef struct Node{ struct Node原创 2020-08-21 16:50:29 · 671 阅读 · 0 评论 -
【经典算法实现 26】二叉树的平衡代码实现 - 自动检测及调整不平衡树(实现对 LR 及 RL 型支持)(最终版代码)
【经典算法实现 25】有序不平衡二叉树 ==> 有序平衡二叉树 代码实现有序不平衡二叉树 ==> 有序平衡满二叉树 移动原理如下,参考下图解:将 4 作为新的根节点(移动节点6)将 6 移动为 4 的右节点, 将 4 的右节点移动为 6 的左节点(移动节点3)取出3,将 4 的左节点指向3 的左节点,将4 的左节点->右节点 指向3, 将3 的左节点指向 2的右节点完整 代码 实现如下:// DSW 左旋转法创建有序数组的平衡二叉树 #include <std原创 2020-08-21 11:17:45 · 491 阅读 · 0 评论 -
二叉查找树的平衡(DSW)
二叉查找树的平衡(DSW)一、有序数组创建二叉查找树树适合于表示某些领域的层次结构(比如Linux的文件目录结构),使用树进行查找比使用链表快的多,理想情况下树的查找复杂度O(log(N)),而链表为O(N),但理想情况指的是什么情况呢?一般指树是完全平衡的时候。哪最坏的情况是什么呢?就是树退化为链表的时,这时候查找的复杂度与链表相同,就失去了树结构的意义。所以树的平衡是非常重要的,这一节我们主要讨论树的平衡问题。如果树中任一节点的两个子树的高度差为0或者1,该二叉树就是高度平衡的。上图中转载 2020-08-20 17:44:43 · 625 阅读 · 0 评论 -
【经典算法实现 25】二叉树的平衡代码实现 - 自动检测及调整不平衡树
【经典算法实现 24】二叉树的平衡代码实现 - 自动检测及调整不平衡树一、不平衡树的检测二、二叉树的自动平衡处理三、自动平衡处理实测结果四、完整代码在前面文章中,我们实现了不衡树的 左平衡 及右平衡代码实现。《【经典算法实现 23】二叉树的平衡代码实现(左平衡)- 顺时针旋转》《【经典算法实现 24】二叉树的平衡代码实现(右平衡)- 逆时针旋转》但实际的二叉树,可并不会像之前的例子一样美好,因为一颗树,可能同时存在需要左平衡 和 右平衡 ,或者多次平衡操作的情况。本文主要是讨论下,不平衡树的检测,原创 2020-08-20 16:12:45 · 502 阅读 · 0 评论 -
【经典算法实现 24】二叉树的平衡代码实现(右平衡)- 逆时针旋转
【经典算法实现 24】二叉树的平衡代码实现(右平衡)- 逆时针旋转一、二叉树右平衡算法(逆时针旋转)1.1 二叉树右平衡算法(逆时针旋转)1.2 运行结果1.3 完整代码在前面《【经典算法实现 23】二叉树的平衡代码实现(左平衡)- 顺时针旋转》中我们实现了不平衡树的左平衡处理,本文代码是在前面的基础了写的。平衡二叉树:左子树 与 右子树 深度差 <= 1ps: 由于加上实现代码,篇幅比较大,因此本章平稀二叉树的情况,将分为几篇文章来写分别为:(1)左平衡,(2)右平衡,(3)左右平原创 2020-08-20 14:03:43 · 666 阅读 · 0 评论 -
【经典算法实现 23】二叉树的平衡代码实现(左平衡)- 顺时针旋转
【经典算法实现 23】二叉树的平衡代码实现(左平衡)- 顺时针旋转一、先创建一颗不平衡二叉树二、左平衡算法2.1 二叉树左平衡算法(顺时针旋转)2.2 二叉树左平衡算法(顺时针旋转) 运行结果2.2.1 实例12.2.2 实例22.2.3 实例3三、左平衡完整代码在前面文章《【经典算法实现 22】根据数组动态创建二叉树(实现方法一)》,我们实现了自动创建二叉树的代码。今天我们重点来分析不平衡的二叉树,如何对二叉树进行 左/右 旋转,从而使其平衡。平衡二叉树:左子树 与 右子树 深度差 <=原创 2020-08-20 12:07:37 · 687 阅读 · 0 评论 -
【经典算法实现 22】根据数组动态创建二叉树(实现方法一)
本文主要实现,根据数据动态创建二叉树的功能。实现结果如下: ----->1 ----->2 ----->3 ----->4 ----->6 ----->5原创 2020-08-19 18:14:00 · 1097 阅读 · 1 评论 -
【经典算法实现 21】Bloom过滤器 C代码实现
【经典算法实现 21】Bloom过滤器 C代码实现一、完整代码二、运行结果本文主要是使用 C语言来实现一个简单的Bloom过滤器算法,有关Bloom Filter的原理请参考《Bloom过滤器》一、完整代码#include <stdio.h>#include <stdlib.h>#include <stdarg.h> // 可变参数 #define MAX_BIT 100 // 定义 Bloom 数组的 bit 数 #define CHAR_BI原创 2020-08-19 14:41:49 · 609 阅读 · 0 评论