数据结构及算法
wangrunmin
这个作者很懒,什么都没留下…
展开
-
程序员必知8大排序3大查找(二)
本文我们先把剩余的三大排序说完,然后讨论一下排序的稳定性问题,最后再总结一下排序的时间复杂度和空间复杂度。(1到5见上篇)6、快速排序 (1)基本思想:选择一个基准元素,通常选择第一个元素或者最后一个元素,通过一趟扫描,将待排序列分成两部分,一部分比基准元素小,一部分大于等于基准元素,此时基准元素在其排好序后的正确位置,然后再用同样的方法递归地排序划分的两部分。(2)实例:转载 2012-05-15 14:25:51 · 585 阅读 · 0 评论 -
数据结构--二叉树--节点的修改(链式结构--队列)
建一个队列,将二叉树的每个 节点入队列并判断处理 #define CHAR /* 字符型 */#include /* EOF(=^Z或F6),NULL */#include /* floor(),ceil(),abs() */#include #define TRUE 1#define FALSE 0#define OK 1#define ERROR 0t原创 2012-08-10 16:15:19 · 1891 阅读 · 0 评论 -
数据结构--二叉树--中序递归遍历二叉树(链式结构)
#define CHAR /* 字符型 */#include /* EOF(=^Z或F6),NULL */#include /* floor(),ceil(),abs() */#include #define TRUE 1#define FALSE 0#define OK 1typedef int Status; /* Status是函数的类型,其值是函数结果状态代原创 2012-08-11 09:33:22 · 1176 阅读 · 0 评论 -
数据结构--二叉树--后续遍历二叉树(顺序结构)
#include #include #define OK 1#define ERROR 0#define TRUE 1#define FALSE 0typedef int Status; /* Status是函数的类型,其值是函数结果状态代码,如OK等 */#if CHARtypedef char TElemType;TElemType Nil=' '; /原创 2012-08-11 16:54:15 · 914 阅读 · 0 评论 -
数据结构--二叉树--后续遍历二叉树(链式结构)
后序遍历二叉树--链式结构#define CHAR /* 字符型 */#include /* EOF(=^Z或F6),NULL */#include /* floor(),ceil(),abs() */#define TRUE 1#define FALSE 0#define OK 1#define ERROR 0typedef int Status; /* Stat原创 2012-08-11 17:18:06 · 870 阅读 · 0 评论 -
数据结构--二叉树--层次遍历二叉树(顺序遍历)
#include /* EOF(=^Z或F6),NULL */#define OK 1#define ERROR 0#define TRUE 1#define FALSE 0typedef int Status; /* Status是函数的类型,其值是函数结果状态代码,如OK等 */#if CHAR typedef char TElemType; TElemTy原创 2012-08-11 19:50:38 · 6701 阅读 · 1 评论 -
数据结构--二叉树--中序非递归遍历二叉树(链式结构)
若栈顶记录的指针值为空,则应退至上一层,若是从左子树返回,则应访问当前层即栈顶记录中指针所指的根节点;若从右子树返回,则表明当前层便利结束,应继续退栈。#define CHAR /* 字符型 */#include /* EOF(=^Z或F6),NULL */#include /* floor(),ceil(),abs() */#include #define TRUE 1#原创 2012-08-11 11:59:12 · 966 阅读 · 0 评论 -
数据结构--二叉树--中序非递归遍历二叉树(链式结构)2
前一个为先判断,条件允许再压栈;这个为先压栈再判断,不合适退栈,先把左子树的所有内容遍历一遍并压栈,然后判断,直到为空,再遍历右子树。#define CHAR /* 字符型 */#include /* EOF(=^Z或F6),NULL */#include /* floor(),ceil(),abs() */#include #define TRUE 1#define原创 2012-08-11 17:34:43 · 1358 阅读 · 0 评论 -
数据结构--二叉树--层次遍历二叉树(链式遍历--队列)
#define CHAR /* 字符型 */#include /* EOF(=^Z或F6),NULL */#include #include /* floor(),ceil(),abs() */#define TRUE 1#define FALSE 0#define OK 1#define ERROR 0typedef int Status; /* Status是原创 2012-08-11 20:54:40 · 2328 阅读 · 0 评论 -
数据结构--数组--马鞍点
如果矩阵A中存在这样的一个元素A[i][j]满足我条件:A[i][j]是第i行中值最小的元素,且又是第j列中值最大的元素,则称之为该矩阵的一个马点。编写一个程序计算出m*n的矩阵A的所有马鞍点#include "stdio.h"#define n 3#define m 3void Get_Saddle(int A[m][n])/*求矩阵A中的马鞍点*/{ int i,j原创 2012-07-31 01:32:58 · 3920 阅读 · 0 评论 -
数据结构--数组--对角矩阵建立
所有非主对角线元素全等于零的n阶矩阵,称为对角矩阵或称为对角方阵。#include "stdio.h"#define n 4int d[n];void Store(int x, int i, int j){/* 把x存为D ( i , j ) */ if (i=n||j>=n) { printf("数组出界!"); exit(1); } if (原创 2012-07-31 01:36:36 · 2116 阅读 · 0 评论 -
数据结构--数组-三对角矩阵
形如这样的矩阵就叫三对角矩阵。星号是数据,其他为零。以按行为主序的原则转存为一维数组M[k]中,则A[i,j]的对应关系为 k=2*i+j.另一种计算方式为 当i=j+1时k=3*i-1 当i=j时k=3*i 当j=i+1时k=3*i+1#include "stdio.h"#define n 4int t[3*n];void Sto原创 2012-07-31 09:14:57 · 6818 阅读 · 0 评论 -
数据结构--数组--对称矩阵的建立
若n阶矩阵A中的元满足下述性质(以数组表示)A[i][j] = A[j][i] 0=则成为n阶对称矩阵。对于n阶矩阵,我们可以为每一对对称元分配一个存储空间,可以将n*n个元压碎存储到n(n+1)/2个元的空间中。不失一般性,我们可以以行序为主序存储其下三角(包括对角线)中的元。假设以一位数组sa[n(n+1)/2]作为n阶对称矩阵A的存储结构,则sa[k]和矩阵数组A[原创 2012-07-31 10:22:15 · 3220 阅读 · 0 评论 -
数据结构--数组--稀疏矩阵的建立
稀疏矩阵的建立#include "stdio.h"#define MAX_SIZE 50 /* 最大的稀疏矩阵 */typedef enum {head, entry} tagfield; //行链表的头指针和列链表的头指针struct entry_node { //非零元节点 int row; //非零元所在行的下标 int c原创 2012-07-31 15:38:50 · 1958 阅读 · 0 评论 -
数据结构--数组--三角矩阵的建立
以主对角线划分,三角矩阵有上三角矩阵和下三角矩阵两种。 ①上三角矩阵 如下图所示,它的下三角(不包括主角线)中的元素均为常数c。 ②下三角矩阵 与上三角矩阵相反,它的主对角线上方均为常数c,如下图所示。 以按行为主序的原则转存为一维数组T[k]中,则A[i,j]的对应关系为 k=i*(i+1)/2+j;#原创 2012-07-31 09:53:05 · 4278 阅读 · 0 评论 -
链表的常见操作
链表是数据结构的重要内容,在计算机程序中应用广泛,同时也是各公司笔试题目的重点。 以下简单实现了链表的一些操作,包括创建、增加节点、删除节点、单链表逆置、合并有序链表等。 一、链表创建 链表主要有三种形式,包括单链表、双链表和循环链表。 单链表每个节点只包含一个后驱指针,双链表节点同时包含一个前驱指针和一个后驱指针,循环链表的尾节点的后驱指向头节点。 代码如下:/*转载 2012-08-22 09:24:02 · 1028 阅读 · 0 评论 -
数据结构--二叉树--中序递归遍历二叉树(顺序结构)
#include /* EOF(=^Z或F6),NULL */#include #define OK 1#define ERROR 0#define TRUE 1#define FALSE 0typedef int Status; /* Status是函数的类型,其值是函数结果状态代码,如OK等 */#if CHARtypedef char TElemType原创 2012-08-11 09:19:42 · 2834 阅读 · 0 评论 -
数据结构--二叉树--双亲、孩子和兄弟节点的查询(链式结构--队列)
#define CHAR /* 字符型 */#include /* EOF(=^Z或F6),NULL */#include /* floor(),ceil(),abs() */#include #define TRUE 1#define FALSE 0#define OK 1#define ERROR 0typedef int Status; /* Status是函原创 2012-08-10 19:54:06 · 10165 阅读 · 2 评论 -
数据结构--二叉树--双亲、孩子和兄弟节点的查询(顺序结构)
#include /* EOF(=^Z或F6),NULL */#define TRUE 1#define FALSE 0#define OK 1#define ERROR 0typedef int Status; /* Status是函数的类型,其值是函数结果状态代码,如OK等 */#if CHARtypedef char TElemType;TElemType原创 2012-08-10 19:21:34 · 14052 阅读 · 0 评论 -
程序员必知8大排序3大查找(三)
三种查找算法:顺序查找,二分法查找(折半查找),分块查找,散列表(以后谈)一、顺序查找的基本思想:从表的一端开始,顺序扫描表,依次将扫描到的结点关键字和给定值(假定为a)相比较,若当前结点关键字与a相等,则查找成功;若扫描结束后,仍未找到关键字等于a的结点,则查找失败。 说白了就是,从头到尾,一个一个地比,找着相同的就成功,找不到就失败。很明显的缺点就是转载 2012-05-15 14:26:46 · 569 阅读 · 0 评论 -
程序员必知8大排序3大查找(一)
每天都在叫嚣自己会什么技术,什么框架,可否意识到你每天都在被这些新名词、新技术所迷惑,.NET、XML等等技术固然诱人,可是如果自己的基础不扎实,就像是在云里雾里行走一样,只能看到眼前,不能看到更远的地方。这些新鲜的技术掩盖了许多底层的原理,要想真正的学习技术还是走下云端,扎扎实实的把基础知识学好,有了这些基础,要掌握那些新技术也就很容易了。 要编写出优秀的代码同样要扎实转载 2012-05-15 14:12:40 · 949 阅读 · 1 评论 -
堆和栈的区别
堆和栈的区别一、预备知识—程序的内存分配 一个由c/C++编译的程序占用的内存分为以下几个部分 1、栈区(stack)— 由编译器自动分配释放 ,存放函数的参数值,局部变量的值等。其操作方式类似于数据结构中的栈。 2、堆区(heap) — 一般由程序员分配释放, 若程序员不释放,程序结束时可能由OS回收 。注意它与数据结构中的堆是两回事转载 2012-05-15 16:35:14 · 596 阅读 · 0 评论 -
数据结构--二叉树的遍历--统计二叉树中叶子结点的个数(先序遍历)
//统计二叉树中叶子结点的个数void CountLeaf(BitTree T,int& count)//累加和存储于变量count中,其初值为0{ if(T)//二叉树T如果为空,则什么都不做;不为空时往下执行 { if((!T->lchild)&&(!T->rchild))//如果二叉树左子树和右子树皆为空,说明该二叉树根节点为叶子节点,count加1。原创 2012-08-03 21:57:18 · 17571 阅读 · 2 评论 -
数据结构--二叉树的遍历--复制二叉树(后序遍历)
//生成一个二叉树的结点BiTNode *GetTreeNode(TElemType item,BitNode *lptr,BiTNode *rptr)//数据域,左指针,右指针{if(!(T = (BiTNode *)malloc(sizeof(BiTNode))))//分配空间 exit(1);T->data = item;//数据域的分配T->lchild = l原创 2012-08-03 21:43:13 · 3207 阅读 · 1 评论 -
数据结构--二叉树--按给定的先序序列建立二叉链表(二叉树的存储)
/*加上空格字符的先序序列*/Status CreateBiTree(BiTree &T){ scanf(&ch);//扫描得到字符 if(ch==' ') T=NULL;//如果字符为空,则根节点为空 else { if (!T=(BiTNode *)malloc(sizeof(BiTNode)))//否则建立根节点原创 2012-08-04 00:28:45 · 7628 阅读 · 0 评论 -
数据结构--二叉树--按给定的表达式健相应的二叉树(二叉树的存储)
1.由先追表示式建树例如:已知表达式的先缀表示式:-*+abc/de。表达式 = (第一操作数)(运算符)(第二操作数)。把运算符当做根节点,第一、二操作数分别作为左右子树。(1)先缀表述法:运算符、第一操、第二操。如-*+abc/de。序列中,如果为操作数则一定是根节点,左右指针不为空;如果为字符,一定是叶子节点,左右指针为空。后缀表述法:数1、数2、操作符。void C原创 2012-08-04 01:46:20 · 3682 阅读 · 0 评论 -
数据结构--二叉树---由二叉树的先序和中序序列建树(二叉树的存储)
例如:已知二叉树的先序序列:a b c d e f g中序序列:c d b a c g f分析可得:根节点是a,左子树是bcd,右子树是egf。原创 2012-08-04 10:00:29 · 2224 阅读 · 0 评论 -
数据结构--二叉树--输出树中从根到每个叶子节点的路径(树遍历算法的应用) .
void AllPath(Bitree T, Stack &S)//输出二叉树上从根到所有叶子结点的路径{ if(T) { Push(S,T->data); if(!T->Left&&!T->Right)//如果左指针和右指针同时为空,才说明该节点为叶子节点 PrintStack(S); else { AllPath(原创 2012-08-04 20:00:08 · 13900 阅读 · 14 评论 -
数据结构--二叉树的遍历--求二叉树的深度(后序遍历)
二叉树为空:深度为0;二叉树为0:深度为1;一般的二叉树:深度=max{左子树的深度,右子树的深度} + 1。int Depth (BiTree T){ if (!T)//如果二叉树根节点为空,则深度为0 depthval=0; else {depthLeft = Depth(T->lchild); //左子树的深度 depthRight =原创 2012-08-03 22:41:19 · 4577 阅读 · 1 评论 -
数据结构--二叉树--求树的深度的算法(树遍历算法的应用)
int TreeDepth(CSTree T){ if(!T) return 0; else{ h1 = TreeDepth(T->firstchild); h2 = TreeDepth(T->nextsibling); return(max(h1+1,h2)); }}原创 2012-08-04 15:30:37 · 1841 阅读 · 0 评论 -
数据结构--二叉树--获得二叉树的深度和根(顺序结构)
//二叉树的顺序存储表示#define MAX_TREE_SIZE 100//二叉树最大节点数typedef TElemType SqBiTree[MAX_TREE_SIZE]//0号单元存储根节点SqBiTree bt;顺序存储结构:用一组地址连续的存储单元依次自上而下、自左而右存储完全二叉树上的结点元素,即将完全二叉树上编号为i的结点元素存储在定义为一维数组中下标为i-1的分量原创 2012-08-05 08:07:44 · 3647 阅读 · 0 评论 -
数据结构--二叉树--获得二叉树的深度和根(链表结构)
采用二叉链表结构构造二叉树,完成其基本操作。 #include #define CHAR /* 字符型 */#include /* EOF(=^Z或F6),NULL */#include /* floor(),ceil(),abs() */#define TRUE 1#define FALSE 0#define OK 1typedef int Status;原创 2012-08-07 17:52:29 · 1188 阅读 · 0 评论 -
数据结构--二叉树--节点的修改(顺序结构,包括二叉树的顺序遍历和打印)
修改某个结点,并打印修改完的二叉树#include /* EOF(=^Z或F6),NULL */#include /* floor(),ceil(),abs() */#include #define TRUE 1#define FALSE 0#define OK 1#define ERROR 0typedef int Status; /* Status是函数的类型,其值原创 2012-08-10 12:44:10 · 2594 阅读 · 0 评论 -
排序---希尔排序
希尔排序(Shell Sort)又称为缩小增量排序,输入插入排序算法,是对直接排序算法的一种改进。本文介绍希尔排序算法。 对于插入排序算法来说,如果原来的数据就是有序的,那么数据就不需要移动,而插入排序算法的效率主要消耗在数据的移动中。因此可知:如果数据的本身就是有序的或者本身基本有序,那么效率就会得到提高。 希尔排序的基本思想是:将需要排序的序列划分成为若干个转载 2012-08-16 09:35:55 · 901 阅读 · 0 评论