![](https://img-blog.csdnimg.cn/20201014180756922.png?x-oss-process=image/resize,m_fixed,h_64,w_64)
数据结构与算法
_Kim
1261895547@qq.com
展开
-
平衡二叉树的四种遍历方式
一、概念 平衡二叉树或者是棵空树,或者是具体下列性质的二叉查找树:它的左子树和右子树都是平衡二叉树,且左子树和右子树的高度只差的绝对值不超过1。若将二叉树结点的平衡因子定义为该节点的左子树的高度减去它的右子树的高度,则所有结点的平衡因子只可能为-1,0,1。只要有一个结点的平衡因子的绝对值大于1,那么这棵树就失去了平衡。 简单例子下图为平衡二叉树下图为非平衡二叉树...原创 2018-12-05 20:57:09 · 5725 阅读 · 0 评论 -
字典树
字典树定义 在计算机科学中,trie,又称前缀树或字典树,是一种有序树,用于保存关联数组,其中的键通常是字符串。与二叉查找树不同,键不是直接保存在节点中,而是由节点在树中的位置决定。一个节点的所有子孙都有相同的前缀,也就是这个节点对应的字符串,而对应根节点空字符串。一般情况下,不是所有的节点都有对应的值,只有叶子节点和部分内部节点所对应的键才有相关的值。(以上来自维基百科) ...原创 2019-01-01 19:25:07 · 185 阅读 · 1 评论 -
树、森林与二叉树的转换
树转换为二叉树将树转换为二叉树的步骤如下:1.加线。在所有(亲)兄弟结点之间加一条连线。2.去线。对树中每个结点,只保留它与第一个孩子结点的连线,删除它与其他孩子结点之间的连线。3.层次分明。以树的根结点为轴心,将整棵树顺时针旋转一定角度,使其层次分明。注意第一个孩子是二叉树结点的左孩子,兄弟转换过来的孩子是结点的右孩子。具体如下图所示:森林转换为二叉树森林由若...转载 2019-01-06 20:16:05 · 582 阅读 · 1 评论 -
极客算法01 | 复杂度分析
1.数据结构和算法概念从广义上讲,数据结构就是指一组数据的存储结构。算法就是操作数据的一组方法。 数据结构和算法是相辅相成的,数据结构是为算法服务,算法要作用在特定的数据结构之上,二者不能孤立。 比如,因为数组具有随机访问的特点,常用的二分查找算法需要用数组来存储数据。但如果我们选择链表这种数据结构,二分查找算法就无法工作了,因为链表并不支持随机访问。 数据结构是静态的,只是组织数据的一...原创 2019-03-05 18:24:52 · 583 阅读 · 0 评论 -
极客算法02 | 数组
为什么数组要从0编号,而不是从1开始呢?如何实现随机访问?数组的定义:数组(Array)是一种线性表数据结构。它用一组连续的内存空间,来存储一组具有相同类型的数据。这个定义里有几个关键词:第一是线性表。顾名思义,线性表就是数据排成像一条线一样的结构。每个线性表上的数据最多只有前和后两个方向。其实除了数组,链表、队列、栈等也是线性表结构。而与它相对立的概念是非线性表,比如二叉...原创 2019-03-05 23:25:33 · 204 阅读 · 0 评论 -
极客算法03 | 链表
一、什么是链表?和数组一样,链表也是一种线性表。 从内存结构来看,链表的内存结构是不连续的内存空间,它是一种通过指针将一组零散的内存块串联起来,从而进行数据存储的数据结构。 链表中的每一个内存块被称为节点Node。节点除了存储数据外,还需记录链上下一个节点的地址,即后继指针next。二、为什么使用链表?即链表的特点插入、删除数据效率高,O(1)级别( 只需更改指针指向即可),随机访...原创 2019-03-06 23:25:48 · 210 阅读 · 0 评论 -
极客算法05 | 队列
队列也是一种“操作受限”的线性表,只支持两种基本操作:入队和出队,满足先进先出的特性。队列的应用非常广泛,特别是一些具有某些额外特性的队列,比如循环队列、阻塞队列、并发队列。它们在很多偏底层的系统、框架、中间件的开发中,起着关键性的作用。比如高性能队列 Disruptor、Linux 环形缓存,都用到了循环并发队列;Java concurrent 并发包利用 ArrayBlockingQueu...原创 2019-03-09 13:55:42 · 239 阅读 · 0 评论 -
极客算法06 | 递归
如何理解递归递归是一种非常高效、简洁的编码技巧,一种应用非常广泛的算法,比如DFS深度优先搜索、前中后序二叉树遍历等都是使用递归。 方法或函数调用自身的方式称为递归调用,调用称为递,返回称为归。 基本上,所有的递归问题都可以用递推公式来表示。递归的优缺点优点:代码的表达力很强,写起来简洁。 缺点:空间复杂度高、有堆栈溢出风险、存在重复计算、过多的函数调用会耗时较多等问题。递归的...原创 2019-03-10 12:53:41 · 226 阅读 · 0 评论 -
极客算法04 | 栈
栈的理解栈,是一种“操作受限”的线性表,只允许在一端插入和删除数据。先进后出,后进先出是它的最大特点。为什么需要这种操作受限的线性表?直接使用数组或者链表不好吗?理由是,数组和链表确实可以代替栈完成我们需要的功能,但是我们要知道,特定的数据结构是对特定场景的抽象,而且,数组或者链表暴露了太多的操作接口,操作虽然灵活,但使用时就比较不可控,自然也更容易出错。从后台开发工程师的角度来看,没...原创 2019-03-07 14:26:11 · 213 阅读 · 0 评论 -
二叉树的非递归遍历
其实二叉树的3种遍历策略,无非是处理节点的时机不同:前序遍历是在遇到节点时即处理,中序是在处理完左节点后再处理,而后序是在处理完左右节点后再处理。使用非递归方法实现时,除了记录当前的节点的访问栈,还需要记录当前节点的状态。那么,前序,中序,后序遍历的唯一不同,无非是将节点加入序列化结果集合的时机不同而已。原创 2018-12-30 14:55:15 · 110 阅读 · 0 评论 -
平衡二叉树的基本操作
ADT定义左平衡处理void LeftBalance(BBSTree &T) { BBSTree lc, rd; lc = T->lchild; switch (lc->bf) { case LH: //LL型,左高则右旋,右旋后均等高 T->bf = lc...原创 2018-12-12 14:01:18 · 700 阅读 · 0 评论 -
B树详解
一,B树的定义 B-树,即为B树。因为B树的原英文名称为B树,而国内很多人喜欢把B树译作B-树,其实,这是个非常不好的直译,很容易让人产生误解。如人们可能会以为B-树是一种树,而B树又是一种树。而事实上是,B-树就是指的B树。一棵简单的三阶B树如下图:一棵m阶B树,或为空树,或为满足下列特性对的m叉树。树中每个结点最多含有m棵子树。 若根结点不是叶子结点,则至少...原创 2018-12-17 19:21:40 · 36785 阅读 · 3 评论 -
广义表
ADTtypedef char AtomType;typedef enum{ ATOM,LIST //ATOM值为0表示原子,LIST值为1表示表结点}ElemTag;typedef struct GLNode{ ElemTag tag; //区分原子结点和表结点 union{ //原子结点和表结点共用...原创 2018-12-12 19:14:03 · 247 阅读 · 0 评论 -
关于树
判定二叉排序树typedef struct { KeyType key; ... ... // 其他数据域} TElemType;typedef struct BiTNode { TElemType data; struct BSTNode *lchild, *rchild;}BSTNode, *BSTree;Status IsBSTree(BSTree...原创 2018-12-12 20:31:57 · 124 阅读 · 0 评论 -
图的遍历
一、概念图的遍历是树的遍历的扩展。图的遍历是指从某一顶点出来,访问图中所有顶点,且使每一顶点仅被访问一次。与树的遍历不同的是,图的遍历需要处理两种特殊情况: 从某一顶点出发进行遍历时,可能访问不到所有其他顶点,比如非连通图; 有些图存在回路,必须保证遍历过程不能因为回路陷入死循环。 解决方法:设访问标志两种常见的遍历方法:深度优先遍历和广度优先遍历 二、深度优先遍历 ...原创 2018-12-13 15:40:46 · 467 阅读 · 0 评论 -
平衡二叉树的失衡及调整
在平衡二叉树中插入一个新结点后,从该结点起向上寻找第一个不平衡的结点(平衡因子df变成了-2或2),以确定该树是否失衡。若找到,则以该结点为根的子树称为最小失衡子树。 如图所示,当新插入结点49后,以55为根结点的子树即为最小失衡子树。 当插入结点导致失衡时,如果将最小失衡子树调整为平衡的子树而且其高度与插入前的高度相同,则整棵树可恢复平衡且无须调整其他结...原创 2018-12-06 17:19:15 · 8930 阅读 · 1 评论 -
单链表及双链表常用方法
单链表存储结构定义typedef struct Node { int data; struct Node *next; }Node, *ptr_Node;typedef enum Status { SUCCESS , ERROR }Status;根据数组生成一条链表,成功则返回头节点,失败返回NULLptr_Node cre...原创 2018-12-06 17:47:36 · 265 阅读 · 0 评论 -
顺序队列及链队列常用方法(实现了泛型队列)
顺序队列存储结构定义(巧用void* 实现泛型队列)typedef struct Aqueue{ void *data[MAXQUEUE]; int front; int rear; size_t data_size; } AQueue;typedef enum{ FALSE=0, TRUE=1} Status;初始化队列void...原创 2018-12-06 20:35:59 · 1377 阅读 · 1 评论 -
顺序栈及链栈常用方法
顺序栈存储结构定义typedef int ElemType;typedef enum Status{ ERROR = 0,OK = 1}Status;typedef struct SqStack{ ElemType *elem; int top; //用于栈顶指针 int size; // 最大大小}SqSt...原创 2018-12-06 22:04:51 · 202 阅读 · 0 评论 -
几种排序方法的对比(快排,归并,插入,计数)
1、非递归快排首先建立结构体存储两个下标struct Node{ int first; int last;}; void Quicksort(int first, int last, int a[]){ int key = a[first]; int i = first; int j = last; int temp; struct Node stack[10...原创 2018-12-07 16:04:54 · 403 阅读 · 0 评论 -
极客算法07 | 排序
冒泡、插入、选择排序冒泡排序:空间复杂度O(1),稳定的排序算法,最好时间复杂度O(n),平均时间复杂度O(n^2)插入排序:空间复杂度O(1),稳定的排序算法,最好时间复杂度O(n),平均时间复杂度O(n^2)选择排序:空间复杂度O(1),不稳定的排序算法,最好时间复杂度O(n^2),平均时间复杂度O(n^2)思考:为什么插入排序要比冒泡排序更受欢迎?冒泡排序不管怎么...原创 2019-03-16 11:31:38 · 273 阅读 · 0 评论