
数据结构
L_Z_
这个作者很懒,什么都没留下…
展开
-
栈和队列的基本操作
栈 一种特殊的的线性表,只允许在固定的一端进行插入和删除操作。栈被称作是先进后出的线性表。 队列 只允许在一端进行插入数据操作,在另一端删除数据操作的特殊线性表。具有先进先出的特性。 循环队列(简单了解) 队空 rear == front; 队满 (rear + 1) % Maxsize == front; 栈的基本操作 初始化、销毁、增、删、查 ...原创 2018-09-23 23:40:36 · 6054 阅读 · 1 评论 -
求解Top K问题
找最小的 k 个数据 需要建大堆,TopK 最好不要在原数组上调整 向下调整 void ArrayAdjustDown(int array[], int size, int root) { int parent = root; while (1) { // 先判断有没有孩子(叶子结点) // 数组角度去想 -> 孩子的下标是否越界 // 只要判断左孩子的下标(因为...原创 2019-01-28 16:24:42 · 321 阅读 · 0 评论 -
链表的基本操作
链表 本文中主要分析以下几个链表: 不带头节点的单链表、带头节点的双向循环链表 链表:一种链式存储的线性表,用一组地址任意的存储单元存放线性表的数据元素,称存储单元为一个节点 链表分类 1.单/双链表 2.带/不带头节点 3.循环/不循环链表 单链表 基本操作:初始化、销毁、插、删、查 在删除和插入中分:头删/插、尾删/插、正常删/插 定义结构体 ty...原创 2018-09-19 17:08:15 · 257 阅读 · 0 评论 -
搜索二叉树转双链表
问题:将搜索二叉树转换成一个排序的双向链表 要求:不能创建任何新的节点,只能调整结点的指向 思路 1.中序遍历(有序) 2.得增加一个前驱 #include <assert.h> #include <stdio.h> typedef int DataType; typedef struct BSTreeNode { DataType key; st...原创 2018-08-31 23:10:09 · 159 阅读 · 0 评论 -
迷宫(暴力破解法)
一、 分析 回溯法 对一个包括有很多个结点,每个结点有若干个搜索分支的问 题,把原问题分解为若干个子问题求解的算法;当搜索到某个结点发 现无法再继续搜索下去时,就让搜索过程回溯(回退)到该节点的前一 个结点,继续搜索该节点外的其他尚未搜索的分支;如果发现该结点 无法再搜索下去,就让搜索过程回溯到这个结点的前一结点继续这样 的搜索过程;这样的搜索过程一直进行到搜索到问题的解或者搜索完 了全部可搜...原创 2018-08-25 15:41:41 · 3323 阅读 · 0 评论 -
复杂链表的复制
问题:一个链表的每个节点,有一个指向next指针指向下一个节点,还有一个random指针指向这个链表中的一个随机节点或者NULL,现在要求复制这个链表 要复制的链表样例 思路 遍历整个链表,复制节点,将新节点插到老节点的后边 遍历整个链表的老节点,复制random字段 将老链表拆成新链表和老链表 定义结构体 #include <stdlib.h>...原创 2018-08-23 14:40:28 · 372 阅读 · 0 评论 -
堆
堆的概念 如果有一个关键码的集合K={k0,k1,k2,…,kn-1},把它的所有元素按完全二叉树的顺序存储方式存储在一个一维数组中,并满足:K[i] &lt;= K[2i+1] 且 Ki&lt;= K[2i+2] (K[i] &gt;= K[2i+1] 且 K[i] &gt;= K[2i+2]) i = 0,1,2…,则称为小堆(或大堆)。 堆的特点 小(大)堆中任一结点的关键码均小...原创 2019-01-24 13:20:12 · 158 阅读 · 0 评论 -
二叉树(三)
求二叉树中两个节点的最近公共祖先节点 思路1: 如果两个节点在左右子树,最近的就是他们的根结点 两个节点在同一侧,用子问题方法求解 BTreeNode * Find(BTreeNode *root, TDataType data) { if(root == NULL) { return NULL; } if(root->data ...原创 2018-12-01 16:06:42 · 182 阅读 · 0 评论 -
二叉树(二)
二叉树的基本操作 求节点个数 求叶子节点个数 求第K层节点个数 求二叉树高度 查找节点是否在树中 判断完全二叉树 求二叉树镜像 求节点个数 //采用后序遍历的方式,先计算左边,在计算右边,最后加上根结点 int GetSize(BTreeNode *root) { if(root == NULL) { return 0; } ...原创 2018-11-05 22:41:04 · 122 阅读 · 0 评论 -
二叉树(一)
二叉树的基本概念 什么是二叉树 一棵二叉树是结点的一个有限集合,该集合或者为空,或者是由一个根节点加上两棵分别称为左子树和右子树的二叉树组成 特点 每个结点最多有两棵子树,即二叉树不存在度大于2的结点 二叉树的子树有左右之分,其子树的次序不能颠倒 两种特殊的二叉树 满二叉树:在一棵二叉树中,如果所有分支结点都存在左子树和右子树,并且所有叶子节点都在同一层上 完全二叉树:如果...原创 2018-10-26 22:56:08 · 304 阅读 · 0 评论 -
判断出入栈的合法性
问题:如入栈的序列(1,2,3,4,5),出栈序列为(4,5,3,2,1),判断是否合法 分析:用两个下标,[ii]标记所给的数组,[io]标记要判断的数组,当栈不为空并且栈顶元素和要判断的[io]所指向的数据一样时出栈,否则就入栈,当 ii<size 时,说明元素已经全部入栈,然后在看[io]和栈顶元素判断合法性 //要用到栈的操作 #include "Stack" int...原创 2018-10-07 19:55:41 · 583 阅读 · 0 评论 -
栈和队列的实现问题
问题一:用两个栈实现一个队列 分析:队列遵循的是先进先出的原则,用两个栈来实现,一个栈管理入队列,另一个管理出队列,出队列就是将第一个栈的元素依次放入第二个栈中,然后在第二个栈进行出栈操作,所表现出的就是出队列了 typedef struct QueueS { Stack stack1; Stack stack2; } QueueS; void QSInit(QueueS *p...原创 2018-10-06 21:08:09 · 711 阅读 · 0 评论 -
Min栈的实现
问题:实现一个栈,要求实现Push(入栈)、Pop(出栈)、Min(返回最小值)的时间复杂度为O(1) 思路:用两个栈来实现,一个存正常栈,另一个存最小栈,要用到栈的基本操作,代码中的"Stack.h"是我写的栈的基本操作的代码 #include <stdio.h> #include "Stack.h" typedef struct MinStack { Stack...原创 2018-10-05 14:02:31 · 594 阅读 · 0 评论 -
逆波兰表达式
问题: 逆波兰式表达方式:先操作数,后操作符 我们用栈来实现:操作数在操作符的前面,按顺序遍历,遇到操作数进栈,遇到操作符让操作数出栈并进行运算,然后将运算结果进栈(过程如图所示) 遇到第一个操作符“+”的时候,由于需要两个操作数,所以出栈两次,执行加法算法,结果是7,7进栈,后面的以此类推 先来定义结构体 typedef enum { OPERAND, // ...原创 2018-09-26 16:47:35 · 397 阅读 · 0 评论 -
括号匹配
括号匹配问题 char a[] = "(())abc{[(])}"; 左右括号次序匹配不正确 char a[] = "(()))abc{[]}"; 右括号多于左括号 char a[] = "(()()abc{[]}"; 左括号多于右括号 char a[] = "(())abc{}"; 左右括号匹配正确 题目分析 这是一道典型的用栈处理的题目,碰到左括号入栈,碰到右括号进行判断和出...原创 2018-09-24 14:45:40 · 1415 阅读 · 0 评论 -
二叉搜索树的基本操作
二叉搜索树 概念 二叉搜索树又称二叉排序树,它或者是一棵空树,或者是具有以下性质的二叉树: 若它的左子树不为空,则左子树上所有节点的值都小于根节点的值 若它的右子树不为空,则右子树上所有节点的值都大于根节点的值 它的左右子树也分别为二叉搜索树 结构 typedef int DataType; typedef struct BSTreeNode { DataType key; ...原创 2019-02-12 13:50:37 · 245 阅读 · 1 评论