随笔分类 - 数据结构
摘要:前言本来是九度oj是一道三星的acm题目,但是同样在《剑指offer》这本书上有所提及,正好我看的时候发现了一处错误,这里纠正一下概念二叉搜索树(binary search tree),或者是一棵空树,或者是具有下列性质的二叉树:若它的左子树不为空,则左子树上所有结点的值均小于它的根结点的值;若它的右子树不为空,则右子树上所有结点的值均大于它的根节点的值。它的左、右子树也分别为二叉排序树。注意:根据概念我们可以明确的知道,二叉搜索树的左、右子树均可为空。构建二叉搜索树或者是遍历可以参考我之前的博客:http://blog.csdn.net/zinss26914/article/details/
阅读全文
摘要:Trie树又称字典树、单词查找树,是一种树形结构,用于保存大量的字符串。优点:利用字符串的公共前缀来节约存储空间。缺点:如果Trie树中存在大量字符串,并且这些字符串基本上没有公共前缀,那么相应的Trie树将非常消耗内存空间,Trie的缺点是空指针耗费内存空间。基本性质:(1)根节点不包含字符,除根节点外的每个节点只包含一个字符。(2)从根节点到某一个节点,路径上经过的字符连接起来,为该节点对应的字符串。(3)每个节点的所有子节点包含的字符串不相同。基本操作有:查找、插入和删除。假设,我们要构建一个26个字母的Trie树,那么每一个指针对应着字母表里的一个字母。从根节点开始,我们只要依次找到目
阅读全文
摘要:概述假如你有一张地图,地图上给出了每一对相邻城市的距离,从一个地点到另一个地点,如何找到一条最短的路?最短路算法要解决的就是这类问题。定义:给定一个有(无)向图,每一条边有一个权值w,给定一个起始点S和终止点T,求从S出发走到T的权值最小路径,即为最短路径。最短路径算法依赖一种性质:一条两顶点间的最短路径包含路径上其他最短路径。最简单的说就是:最短路径的子路径是最短路径。松弛技术松弛技术本质上是一个贪心操作。松弛操作:对每个顶点v属于V,都设置一个属性d[v],用来描述从源点s到v的最短路径上权值的上界,称为最短路径估计(shortest-path estimate),同时parent[v]代
阅读全文
摘要:并查集并查集保持一组不相交的动态集合S={S1, S2, ..., SK}.每个集合通过一个代表来表示,代表即集合中的某个成员。并查集的精髓(即它的三种操作):集合中的每一个元素是由一个对象表示的,设x表示一个对象MAKE-SET(x)建立一个新的集合,其唯一成员(因而其代表)就是x。因为各个集合是不相交的,故要求x没有在其他集合中出现过。初始化后每一个元素的父亲节点是它本身,每一个元素的祖先节点也是它本身示例代码#include <stdio.h>
#include <stdlib.h> int father[1001]; int main()
{ int n, m,
阅读全文
摘要:图的定义和术语图中数据元素通常称为顶点(Vertex),V是顶点的有穷非空集合VR是两个顶点之间的关系的集合若<v,w>属于VR,则<v,w>表示从v到w的一条弧(Arc),且称v为弧尾(Tail)或起始点(Inital node),称w为弧头(Head)或终端点(Terminal node),此图称为有向图(Digraph)若<v,w>属于VR必有<w,v>属于VR,即VR是对称的,则以无序对(v,w)代替这两个有序对,表示v和w之间的一条边(Edge),此时图称为无向图(Undigraph)我们用n表示图中顶点的数目,用e表示边或弧的数目,那
阅读全文
摘要:题目题目描述: 输入一系列整数,建立二叉排序数,并进行前序,中序,后序遍历。
输入: 输入第一行包括一个整数n(1<=n<=100)。 接下来的一行包括n个整数。
输出: 可能有多组测试数据,对于每组数据,将题目所给数据建立一个二叉排序树,并对二叉排序树进行前序、中序和后序遍历。 每种遍历结果输出一行。每行最后一个数据之后有一个空格。
样例输入:
5
1 6 5 9 8
样例输出:
1 6 5 9 8 1 5 6 8 9 5 8 9 6 1 提示:
输入中可能有重复元素,但是输出的二叉树遍历序列中重复元素不用输出。AC代码#include <std...
阅读全文
摘要:图示C内存分配程序代码区存放函数体的二进制代码全局数据区全局变量和静态变量的存储是放在一起的。初始化的全局变量和静态变量在一块区域,未初始化的全局变量和未初始化的静态变量在相邻的另一块区域。常量数据存放在另一个区域里。这些数据在程序结束后由系统释放。我们所说的BSS段(bss segment)通常是指用来存放程序中未初始化的全局变量的一块内存区域。BSS是英文Block Started by Symbol的简称栈区由编译器自动分配释放,存放函数的参数值,局部变量的值等。其操作方式类似于数据结构中的栈堆区一般由程序员分配释放,若程序员不释放,程序结束时可能由OS回收命令行参数区存放命令行参数和环
阅读全文
摘要:前言一道比较简单的二叉树题目,需要了解的知识点,当前结点为i,采用数组存储树的每个结点:左孩子为2 * i右孩子为2 * i + 1吐嘈一下,其实我的代码功底在公司应该是非常强的,哎,不搞开发搞运维真是感觉有些可惜啊!题目图片题目描述如上所示,由正整数1,2,3……组成了一颗特殊二叉树。我们已知这个二叉树的最后一个结点是n。现在的问题是,结点m所在的子树中一共包括多少个结点。 比如,n = 12,m = 3那么上图中的结点13,14,15以及后面的结点都是不存在的,结点m所在子树中包括的结点有3,6,7,12,因此结点m的所在子树中共有4个结点。
输入: 输入数据包括多行,每...
阅读全文
摘要:前言用最大堆实现的最大优先级队列一般用来进行作业调度的问题用最小堆实现的最小优先级队列一般用于贪心等概念优先级队列是一种用来维护一组元素构成的集合S的数据结构,这一组元素中的每一个都有一个关键字key。这里以最大堆实现的最大优先级队列为例,支持如下操作:extract_max(A, n) : 去掉并返回A中的具有最大关键字的元素increase_key(A, i, key) : 将元素A[i]关键字变为key并且保持最大优先级队列的性质实现extract_max/** * Description:从节点i开始,维护以i为根节点的子树,使以i为根的子树为最大堆(非递归) */
void ma..
阅读全文
摘要:堆排序概述堆排序定义n个关键字序列k(1), k(2), ..., k(n)称为堆,当且仅当该序列满足如下性质(简称为堆性质)k(i) <= k(2i) && k(i) <= k(2i+1)k(i) >= k(2i) && k(i) >= k(2i+1)若将此序列所存储的向量R[1..n]看做是一颗完全二叉树的存储结构,则堆实质上是满足如下性质的完全二叉树:树中任一非叶结点的关键字均不大于(或不小于)其左右孩子(若存在)结点的关键字。大根堆和小根堆根结点(亦称堆顶)的关键字是堆里所有结点关键字中最小者的堆称为小根堆根节点(亦称堆顶)的关键
阅读全文
摘要:前言学习贪心算法的时候复习了一下哈夫曼树的构造,这里记录一下,参考链接:http://blog.csdn.net/zinss26914/article/details/8461596主要是记录一道九度的哈夫曼树的题目题目题目描述:
哈夫曼树,第一行输入一个数n,表示叶结点的个数。需要用这些叶结点生成哈夫曼树,根据哈夫曼树的概念,这些结点有权值,即weight,题目需要输出所有结点的值与权值的乘积之和。
输入:
输入有多组数据。
每组第一行输入一个数n,接着输入n个叶节点(叶节点权值不超过100,2<=n<=1000)。
输出:
输出权值。
样例输入:
5 1 2 2 5 9
样例输
阅读全文
摘要:前言今天在家里做acm的时候,用到了sscanf()函数,感觉特别犀利,这里记录一下用法。sscanf()函数原型int sscanf(const char *str, const char *format, mixed var1, mixed var2);说明:sscanf()会将参数str的字符串根据参数format来转换并格式化数据。format格式{%[*] [width][{h | l | l64 | L}]type | ' ' | t' | '\n' | 非%符号}注:*可用于格式中,(即%*d和%*s)加了星号(*)表示跳过此数据不读入。(
阅读全文
摘要:n阶矩阵旋转矩阵的顺时针旋转基本有四种情况:0度90度180度270度,相当于逆向的90度算法思路矩阵的计算主要是考虑下标之间的变换,先上一张我在纸上分析的图(ps:好大啊,没有压缩)以aij为例,i,j均从1开始计数90度旋转:列号变为行号(n - 行号 + 1)变成列号规律: a[i][j] = b[j][n - i + 1]180度旋转:(n - 行号 + 1)变为行号(n - 列号 + 1)变为列号规律:a[i][j] = b[n - i + 1][n - j + 1]270度旋转(相当于逆时针旋转90度):行号变为列号(n - 列号 + 1)变为行号规律:a[i][j] = b[n
阅读全文
摘要:树的路径长度树的路径长度是从树根到树中每一结点的路径长度之和。在结点数目相同的二叉树中,完全二叉树的路径长度最短。树的带权路径长度(weighted path length of tree,wpl)结点的权值:在一些应用中,赋予树中结点的一个有某种意义的实数、结点的带权路径长度:结点到树根之间的路径长度与该结点上权的乘积树的带权路径长度(wpl):定义为树中所有结点的带权路径长度之和最优二叉树在权为w1,w2,...,wn的n个叶子结点所构成的所有二叉树中,带权路径长度最小(即代价最小)的二叉树成为最优二叉树。注意:叶子上的权值均相同时,完全二叉树一定是最优二叉树,否则完全二叉树不一定是最优二
阅读全文
摘要:前言最近两个星期一直都在断断续续的学习二叉树的数据结构,昨晚突然有点融汇贯通的感觉,这里记录一下吧题目要求给定前序序列,abc##de#g##f###,构建二叉树,并且用递归和非递归两种方法去做前序,中序和后序遍历二叉树的数据结构/** * 定义二叉树的数据结构 */
struct btree
{ char item; struct btree *lchild; struct btree *rchild;
};
typedef struct btree* bt; /** * 定义栈数据结构(用于非递归遍历) */
struct seqstack
{ bt data[maxsi...
阅读全文
摘要:树的定义树(tree)是n(n>=0)个结点的有限集合T,T为空时称为空树,否则它满足如下两个条件:(1)有且仅有一个称之为根(root)的结点(2)其余的结点可分为m(m>=0)个互不相交的子集T1,T2,....,Tm,其中每个子集本身又是一棵树,并称之为根的子树(subtree)注意:树的递归定义刻画了树的固有特性:一棵非空树若是由若干棵子树构成的,而子树又可以由若干棵更小的树组成树结构的基本术语结点的度(degree)树的结点:包含一个数据元素及若干指向其子树的分支。结点的度:结点拥有的子树数称为结点的度(degree)叶子:度为0的结点分支结点:度不为0的结点孩子(chi
阅读全文

浙公网安备 33010602011771号