
数据结构与算法
chenyu-max
一个热爱前端的小菜菜
展开
-
数据结构——哈夫曼树深入浅出含图解(含C++代码实现)
前言问题:将百分制的成绩变为五分制的成绩if(score < 60) grade = 1;else if(score < 70) grade = 2;else if(socre < 80) grade = 3;else if(socre < 90) grade = 4;else grade = 5;我们将其画为一颗判定树如果我们学生的成绩绝大多数都是90,80,但是60分的很少,这颗判定树的效率就很低了。如果考虑学生成绩的分布概率按照上述的查找方法,查找效率原创 2020-07-23 15:42:43 · 1349 阅读 · 0 评论 -
数据结构——堆的基本操作(堆的建立、插入、删除等)详解
前言数据结构之——堆(Heap)此篇博客粗略讲解了堆的一些概念接下来讲解堆的一些基本操作本次堆的操作均以最大堆(大顶堆)为例堆的建立#define MAXDATA 10000struct HNode { int* Data; // 存储元素的数组 int Size; // 堆中当前元素个数 int Capacity; // 堆的最大容量 };// 创建容量为MaxSize的空的最大堆原创 2020-07-22 15:35:00 · 2051 阅读 · 0 评论 -
数据结构之——堆(Heap)
堆(Heap)堆(Heap)是计算机科学中一类特殊的数据结构的统称。堆通常是一个可以被看做一棵完全二叉树的数组对象。完全二叉树既然说堆是完全二叉树,那么就得介绍下什么是完全二叉树定义:若设二叉树的高度为h,除第h层外,其它各层(1~h-1)的结点数都达到最大个数,且第h层所有的节点都连续集中在最左边,这就是完全二叉树。完全二叉树是由满二叉树而引出来的。对于深度为K,有N个结点的二叉树,当且仅当其每一个结点都与深度为K的满二叉树中编号从1至n的结点一一对应时称之为完全二叉树。若一棵二叉树至多只有最原创 2020-07-20 18:22:23 · 1222 阅读 · 0 评论 -
平衡二叉树及其调整(含图含代码,C++实现)
前言平衡二叉树(Balanced Binary Tree)又被称为AVL树(有别于AVL算法)。在AVL树中,任一节点对应的两棵子树的最大高度差为1,因此它也被称为高度平衡树。查找、插入和删除在平均和最坏情况下的时间复杂度都是O(logn)。平衡因子(Balance Factor,简称BF): BF(T) = hL-hR,hL和hR分别代表左右子树高度我们希望的平衡树是空树或者左右两边高度差不超过1,即 |BF(T)| <=1如下,图a为AVL树,图b不是AVL树图a 图b为什么要有原创 2020-07-20 16:36:26 · 1252 阅读 · 0 评论 -
二叉搜索树(二叉排序树)及其基本操作(查找,插入,删除)C++代码表示(含递归与非递归)看完别告诉我你还不会!
前言查找问题:静态查找:我们要找的元素是不动的,我们要做的只有 find 操作,没有 delete 和 insert 操作动态查找:我们要找的集合会发生动态的变化,不仅有 find 操作,还有delete、find操作针对静态问题,除了O(n)的顺序查找,还有O(nlogn)的二分查找,为什么二分查找效率这么高,是因为我们事先对数据进行了有效的组织,变成有序化,这样我们可以形成一个叫做判定树的这样一种结构,把线性的查找过程,转化成在树上的查找过程,查找效率,就是树的高度,所以我们就想,能不能把数原创 2020-07-20 13:15:19 · 1578 阅读 · 2 评论 -
二叉树遍历的一些简单应用
输出二叉树的叶子结点思路:在二叉树遍历算法中增加检测其左右结点是否为空void PreOrderTraversal (BinTree *BT){ if(BT) { if(!BT->Left && !BT->Right) cout << BT->Value << ednl; PreOrderTraversal(BT->Left); PreOrderTraversal(BT->Right); }}求二叉原创 2020-07-18 11:06:54 · 1690 阅读 · 0 评论 -
简述二叉树的层序遍历(队列),五分钟保证理解
前言我在我的上一个博客写了二叉树的三种遍历(前序,中序,后序),递归与非递归表示之后又学习了另一种二叉树的遍历,叫做层序遍历。这一次我又学了点知识,为上一次做点补充吧。二叉树遍历的核心问题:二维结构的线性化从结点访问其左、右结点访问左结点后,右结点怎么办?需要一个存储结构保存暂时不访问的结点存储结构:堆栈、队列层序遍历队列实现:遍历从根结点开始,首先将根结点入队,然后开始执行循环:结点出队、访问该结点、其左右结点入队如图二叉树我们用队列进行遍历分析层序遍历基本过程从原创 2020-07-18 10:34:13 · 1215 阅读 · 0 评论 -
二叉树的三种遍历(前序,中序,后序),递归与非递归表示,(初中生表示看完就懂了)
二叉树的三种遍历对如图二叉树我们分别用前序,中序,后续三种遍历递归表示前序首先访问根,再先序遍历左(右)子树,最后先序遍历右(左)子树代码实现如下void PreOrderTraversal(BinTree *BT){ if(*BT) { printf("%d",BT->Data); PreOrderTraversal(BT->Left); PreOrderTraversal(BT->Right); }}根据路径,第一次遇见的结点输出那么此时根据原创 2020-07-17 19:08:59 · 17380 阅读 · 12 评论 -
后缀表达式 和 中缀表达式(波兰表达式/逆波兰表达式)
前言由两类对象构成运算数:如5,6,2,3,4运算符号:如+,/,-,*运算符号的优先级不同计算机处理表达式,它并不能像人一样有逻辑的去判断先处理哪一步,后处理哪一步,它只会严格的按照从左只有执行。就像5+6/2 按照计算机的思维 就是 (5+6)/2 这个6 是否拿来做加分运算,按照计算机的思维是不知道的所以我们一如了一种表达式,叫做后缀表达式后缀表达式后缀表达式也叫逆波兰表达式,其求值过程可以用到栈来辅助存储。中缀表达式:5+6/2-34后缀表达式:562/+34-这两原创 2020-07-16 15:23:43 · 2342 阅读 · 2 评论 -
不会吧不会吧,不会真有人还不会算时间复杂度吧?用十分钟让你明白如何计算时间复杂度
前言:算法的分析方式有两种:事后分析统计方法:编写算法对应程序,统计其执行时间。存在问题:编写程序的语言不同,执行程序的环境不同等因素事前估算分析方法:撇开上述因素,认为算法的执行时间是问题规模n的函数。所以我们引入了时间复杂度的概念来对算法进行分析分析算法的执行时间求出算法所有原操作的执行次数(也称为频度),它是问题规模n的函数,用 T(n) 表示。算法执行大致时间 = 原操作所需的时间 * T(n)所以算法的执行时间与 T(n) 成正比为此用 T(n) 表示算法的执行时间频原创 2020-07-10 13:01:17 · 5761 阅读 · 5 评论