数据结构与算法
文章平均质量分 63
数据结构与算法
狡猾的狐狸科
小白水平,一起加油!
展开
-
平衡二叉树
平衡二叉树 平衡二叉树: 平衡二叉树也叫平衡二叉搜索树 (Self-balancing Binary Search Tree) 又被称为 AVL 树,可以保证查询效率较高。平衡二叉树它的左右两个子树的高度差的绝对值不超过1,并且左右两个子树都是一棵平衡二叉树。平衡二叉树的常用实现方法有红黑树、AVL、替罪羊树、Treap、伸展树等。左旋转举例说明,下面这颗二叉树的左子树的深度为 1 ,右子树的深度为 3, 相差的绝对值超过了 1 ,通过左旋转达到平衡。步骤:创建新的结点(newNode),原创 2021-02-09 22:41:38 · 452 阅读 · 1 评论 -
二叉排序树
二叉排序树 二叉排序树: (Binary Sort Tree),对于二叉排序树的任何一个非叶子节点,要求左子节点的值小于等于当前节点的值,右子节点的值大于等于当前节点的值。将序列 {7, 3, 10, 12, 5, 1, 9, 2} 构造成而二叉排序树举例说明:添加操作步骤: 添加 7 :7 作为根结点 添加 3 :3 比 7 小且 7 的左子节点为空,作为 7 的左子节点 添加 7 :10 比 7 大且 7 的右子节点原创 2021-02-08 17:57:30 · 1136 阅读 · 2 评论 -
哈夫曼树
哈夫曼树 结点的带权路径长度: 从根结点到该结点之间的路径长度与该结点的权的乘积。 树的带权路径长度: 所有叶子结点的带权路径长度之和,记为 WPL (weighted path length)。 哈夫曼树: 给定 n 个权值作为 n 个叶子结点,构造一棵二叉树,若该树的带权路径长度 (wpl) 达到最小,称这样的二叉树为最优二叉树,也称为哈夫曼树(Huffman Tree)。哈夫曼树是带权路径长度最短的树,权值较大的结点离根较近。接下来举个例子说明,比如将 {1,5,2,7,9} 构造成树,原创 2021-02-07 16:28:49 · 2941 阅读 · 1 评论 -
线索二叉树
线索二叉树 n 个结点的二叉链表中含有 n+1 个空指针域。利用二叉链表中的空指针域,存放指向该结点在某种遍历次序下的前驱和后继结点的指针(这种附加的指针称为"线索"),这种加上了线索的二叉链表称为线索链表,相应的二叉树称为线索二叉树(Threaded Binary Tree) 。根据线索性质的不同,线索二叉树可分为前序线索二叉树中序线索二叉树后序线索二叉树以下面这个例子说明 在该二叉树中一共有 6 个结点,有 7 个空指针域(3 有一个,4, 5, 6各有两个),根据遍历次序的不同原创 2021-02-04 17:33:41 · 668 阅读 · 2 评论 -
查找算法
查找算法#mermaid-svg-nsHA2KLnKdZQcB1Y .label{font-family:'trebuchet ms', verdana, arial;font-family:var(--mermaid-font-family);fill:#333;color:#333}#mermaid-svg-nsHA2KLnKdZQcB1Y .label text{fill:#333}#mermaid-svg-nsHA2KLnKdZQcB1Y .node rect,#mermaid-svg-nsHA2原创 2021-01-31 20:28:44 · 100 阅读 · 0 评论 -
排序算法
排序算法排序算法是将一组数据依照指定的顺序进行排列的过程。排序算法又分为内部排序和外部排序:内部排序: 指将需要处理的所有数据都加载到内部存储器(内存)中进行排序。外部排序法:数据量过大,无法全部加载到内存中,需要借助外部存储(文件等)进行排序。此处只详述内部排序,如下图:#mermaid-svg-dWb4UudisFceIm1f .label{font-family:'trebuchet ms', verdana, arial;font-family:var(--mermaid-font-原创 2021-01-30 19:52:54 · 207 阅读 · 3 评论 -
波兰计算器和逆波兰计算器
波兰计算器和逆波兰计算器波兰表达式 波兰表达式也称前缀表达式,他是运算符写在数字的前边一种表达式。举个例子,比如一般表达式,也就是前缀表达式 (15 + 4) * 5 - 6(15 + 4) 的波兰表达式为 15 4 +(15 + 4) * 5 的波兰表达式为 15 4 + 5 *(15 + 4) * 5 - 6 的波兰表达式为 15 4 + 5 * 6 -逆波兰表达式 逆波兰表达式也称后缀表达式,他是运算符写在数字的后边一种表达式。还是上面那原创 2021-01-28 13:48:19 · 491 阅读 · 0 评论 -
栈模拟计算器
栈模拟计算器 计算器是我们生活中最常见的数学用具,计算器可以用栈来模拟。模拟计算器要点:使用两个栈分别来存储数字和运算符以及括号。遍历表达式字符串,分别处理’(’,’)’,运算符和数字。 如果是 ‘(’ 则直接入栈, 如果是 ‘)’ 则计算括号中的结果,如果是运算符则根据前一个操作符判断要计算还是直接入栈,如果是数字则根据表达式后一位判断要入栈还是继续读取数字拼接。遍历完字符串后,清空运算符栈,计算最终结果。下面代码演示一下:import java.util.Stack;import原创 2021-01-27 21:36:17 · 434 阅读 · 5 评论 -
单向循环链表
单向循环链表 单向循环链表和单向非环形链表的区就是,单向非环形链表的尾结点的指针是指向null的,而环形的是指向头结点。单向循环链表如图下所示:节点类代码class MyNode { int data; MyNode next; String name; public MyNode() { } public MyNode(int data) { this.data = data; } public MyNode(原创 2021-01-27 14:51:05 · 832 阅读 · 0 评论 -
青蛙跳台阶的相关问题
青蛙跳台阶的相关问题问题一:青蛙一次只能跳 1 个台阶或者 2 个台阶, 计算从 0 台阶跳到 n 台阶有多少跳法,也就是的路径种类总和。import java.util.HashMap;public class StepJump { // 当青蛙只能跳 1 个台阶或者 2 个台阶, 计算从 0 台阶跳到 n 台阶的路径种类总和 // 这个类似斐波那契数列 1 1 2 3 5 8 13 // f(0)=1, f(1)=1, f(2)=f(0)+f(1),[其中f(0)表示从0原创 2020-10-31 10:43:39 · 2084 阅读 · 26 评论 -
汉诺塔
汉诺塔关于汉诺塔的传说:汉诺塔:汉诺塔(又称河内塔)问题是源于印度一个古老传说的益智玩具。大梵天创造世界的时候做了三根金刚石柱子,在一根柱子上从下往上按照大小顺序摞着64片黄金圆盘。大梵天命令婆罗门把圆盘从下面开始按大小顺序重新摆放在另一根柱子上。并且规定,在小圆盘上不能放大圆盘,在三根柱子之间一次只能移动一个圆盘。接下来用 Java 语言实现汉诺塔public class HannoiGame { static int times; // 记录移动次数 public static void原创 2020-10-26 12:39:17 · 746 阅读 · 0 评论 -
单向链表
单向链表 链表不像数组那样,可以通过索引来获取,单向链表查找的时候必须从头开始往后一个个找,而不能从中间找,也不能从后往前找。看看下图所示的单向链表。节点类代码class MyNode { int data; MyNode next; String name; public MyNode() { } public MyNode(int data) { this.data = data; } public MyNo原创 2021-01-26 16:02:45 · 196 阅读 · 0 评论 -
稀疏数组
稀疏数组 当一个数组中大部分元素为0,或者为同一个值的数组时,可以使用稀疏数组来保存该数组。比如下面这个 10 x 10 的数组中只有三个数据,大部分元素是0。现在把这个数组改成稀疏数组,如下下面表格解释一下这个稀疏数组:稀疏数组(sparse array)行(row)列(col)值(value)[0](原始数组规模)10(原始数组有10行)10(原始数组有10列)3(原始数组有3个数据)[1](第一个数据)121[2](第二个数据)25原创 2021-01-25 21:00:05 · 120 阅读 · 0 评论 -
堆
堆堆的定义通常情况下我们把堆看成是一棵完全二叉树。堆一般分为两种,一种是最大堆,一种是最小堆。最大堆要求根节点的值即大于左子树的值,又大于右子树的值。也就是说最大堆根节点的值是堆中最大的。最小堆根节点的值是堆中最小的,以最小堆为例子,如下图他是数组结构,结点中的数字是数组元素的下标,不是数组元素的值。所以如果我们知道父节点的下标我们就可以知道他的两个子节点(如果有子节点),如果知道子节点的下标也一定能找到父节点的下标,他们的关系是:父节点的下标 =(子节点下标 - 1)>>1;原创 2021-01-23 20:29:21 · 301 阅读 · 0 评论 -
树的遍历
树的遍历先了解一下树的相关定义:结点的度:一个结点含有的子结点的个数称为该结点的度;叶结点或终端结点:度为0的结点称为叶结点;非终端结点或分支结点:度不为0的结点;双亲结点或父结点:若一个结点含有子结点,则这个结点称为其子结点的父结点;孩子结点或子结点:一个结点含有的子树的根结点称为该结点的子结点;兄弟结点:具有相同父结点的结点互称为兄弟结点;树的度:一棵树中,最大的结点的度称为树的度;结点的层次:从根开始定义起,根为第1层,根的子结点为第2层,以此类推;树的高度或深度:树中结点的最大原创 2021-01-23 16:31:54 · 176 阅读 · 0 评论 -
栈
栈栈是一种先进后出的数据结构,如下图:package datastructure;public class MyStack<E> { private Object [] data; private int size; public MyStack(int capacity) { if (capacity <= 0) throw new IllegalArgumentException("栈的大小必须大于0");原创 2021-01-22 21:15:11 · 114 阅读 · 1 评论 -
队列
队列一般队列队列是一种先进先出的数据结构。public class MyQueue<E> { private Object[] data; private int maxSize; private int size; private int front; private int tail; public MyQueue(int maxSize) { if (maxSize <= 0) thro原创 2021-01-22 20:46:19 · 96 阅读 · 0 评论 -
双向链表
双向链表双向链表我们可以从头到尾查找,也可以从尾到头查找。双向链表图如下:1、双向链表结点类class Node<E>{ E data; Node<E> prev; Node<E> next; public Node(E data, Node<E> prev, Node<E> next) { this.data = data; this.prev = prev;原创 2021-01-22 17:54:50 · 129 阅读 · 0 评论 -
约瑟夫环相关问题的解法
约瑟夫环问题来源 据说著名犹太历史学家 Josephus有过以下的故事:在罗马人占领乔塔帕特后,39 个犹太人与Josephus及他的朋友躲到一个洞中,39个犹太人决定宁愿死也不要被敌人抓到,于是决定了一个自杀方式,41个人排成一个圆圈,由第1个人开始报数,每报数到第3人该人就必须自杀,然后再由下一个重新报数,直到所有人都自杀身亡为止。然而Josephus 和他的朋友并不想遵从。首先从一个人开始,越过k-2个人(因为第一个原创 2020-11-04 22:29:58 · 548 阅读 · 0 评论 -
C语言实现纸牌游戏--小猫钓鱼
C语言使用队列和栈实现纸牌游戏–小猫钓鱼C语言://纸牌游戏--小猫钓鱼--队列 栈--(所谓的拉火车) #include <stdio.h>struct queue //队列 { int data[1000]; int head; int tail;}; struct stack //栈 { int data[10]; int top;};int main(void){ struct queue q1, q2; //小原创 2020-10-09 21:22:35 · 2029 阅读 · 1 评论 -
C语言实现队列
C语言实现队列基本操作-初始化,入队,出队,打印,删除C语言:#include <stdio.h> #include <stdlib.h>// 队列的实现#define OVERFLOW -2 #define OK 1#define ERROR 0typedef int Status;typedef int QElemType; typedef struct QNode{ QElemType data; struct QNode * next;}QNo原创 2020-10-07 22:56:08 · 1630 阅读 · 0 评论 -
中缀表达式转后缀表达式
中缀表达式转后缀表达式-C语言,JavaC语言:#include <stdio.h>#include <stdlib.h>#include <string.h>#define STACK_INIT_SIZE 100 // 存储空间初始化分配量#define STACKINCREMENT 10 // 存储空间分配增量#define OVERFLOW -2 #define OK 1#define ERROR 0typed原创 2020-10-07 00:27:55 · 606 阅读 · 0 评论 -
C语言实现栈
栈-基本操作初始化,返回栈顶,出栈,入栈,判断是否空栈C语言:#include <stdio.h> #include <stdlib.h>#define STACK_INIT_SIZE 100 // 存储空间初始化分配量#define STACKINCREMENT 10 // 存储空间分配增量#define OVERFLOW -2 #define OK 1#define ERROR 0typedef int Status;typ原创 2020-10-06 22:51:23 · 1455 阅读 · 0 评论 -
单链线性表
单链线性表的基本操作–创建,插入,删除,查看,打印C语言:#include<stdio.h>#include<stdlib.h> // 分配地址和删除地址函数的头文件 #define OK 1 // 宏定义,作为返回值 #define ERROR 0typedef int Status; // 如需要更改类型,在此处更改一次即可 typedef int ElemType;typedef struct L原创 2020-10-02 21:47:23 · 596 阅读 · 0 评论