数据结构
壹晴天
种一棵树最好的时候是十年前,其次是现在!不要抱怨,继续奔跑!
展开
-
二叉树中序非递归遍历
void Inorder(Bitree T){//中序 (左右根) //对应出栈顺序 initstack(S); Bitree P=T; //初始化栈,P是遍历指针 while(p||Isempty(S)){ if(p){ push(S,p); //入栈、移动指针 p=p->lchild; } else{ pop(S,p);原创 2021-09-22 08:30:28 · 58 阅读 · 0 评论 -
二叉树先序非递归遍历
void Preorder(Bitree T){//先序 (根左右) //对应进栈顺序 initstack(S); Bitree P=T; //初始化栈,P是遍历指针 while(p||Isempty(S)){ if(p){ visit(p); push(S,p); //访问、入栈、移动指针 p=p->lchild; } else{原创 2021-09-22 08:30:02 · 67 阅读 · 0 评论 -
二叉树后序非递归遍历
//先序“根左右” 后序“左右根” 从输出结果来看可以将先序中的左子树当作右子树,把右子树当作左子树,依次进栈,出栈就是后序次序//后序遍历最后访问根节点,根是压在栈底的,当访问到某节点时候,栈中的元素均是该结点的祖先void postorder(bitree T){ initstack(S); p=T; r=null; while(p||!isempty(S)){ if(p){ //走到最左边原创 2021-09-22 08:29:44 · 45 阅读 · 0 评论 -
二叉树的层次遍历
void Levelorder(Bitree T){ //层次遍历 initstack(Q); Bitree p; enqueue(Q,p); while(!isempty(Q)){ dequeue(Q,p); visit(p); if(p->lchild != null) //左子树不空、入队 enqueue(p->lchild) if(p->rchild !=原创 2021-09-22 08:29:27 · 36 阅读 · 0 评论 -
递归算法求树的高度
//递归算法求树的高度(也可以用层次遍历,非递归后序遍历)int bidepth(bitree T){ if(T==null) return 0; ldep=bidepth(T->lchild);//左子树高度 rdep=bidepth(T->rchild);//右子树高度 if(ldep>rdep) return ldep+1; else return rdep+1;}...原创 2021-09-22 08:29:12 · 2161 阅读 · 0 评论 -
二叉树递归遍历。前序,后续,中序
void Preorder(Bitree T){ //先序遍历 if(p!=null){ vist(p) Preoder(p->lchild) Preoder(p->rchild) }}void Inorder(Bitree T){ //中序遍历 if(p!=null){ Inoder(p->lchild) vist(p) Inoder(p->rchild) }}void Postorde原创 2021-09-22 08:30:40 · 36 阅读 · 0 评论 -
深度优先遍历DFS
bool visited[max];//标记访问数组void DFStraverse(graph G){ //对图进行深度优先遍历 for(i=0;i<G.vexnum;i++) //访问标记数组初始化 visited[i]=false; for(i=0;i<G.vennum;++i){ //从0号结点开始遍历 if(!visited[i]) //对每个连通分量调用一次 DFS(原创 2021-09-20 22:36:47 · 73 阅读 · 0 评论 -
广度优先遍历BFS
bool visited[max];//标记访问数组void BFStraverse(graph G){ //对图进行广度优先遍历 for(i=0;i<G.vexnum;i++) //访问标记数组初始化 visited[i]=false; initqueue(Q); //初始化辅助队列Q for(i=0;i<G.vennum;++i){ //从0号结点开始遍历 if(!visited原创 2021-09-20 22:36:01 · 115 阅读 · 0 评论 -
归并排序算法
int *b=(int)malloc((n+1)*sizeof(int))//建立辅组数组b[] void merge(int a[],int low,int mid,int high){ //表a的两段a[loe……mid]和a[mid+1……high]各自有序,将他们合成一个有序表 for(int key=low;k<=high;k++) b[k]=a[k]; //将a中的元素复制到b中 for(i=low,j=mid+1,k原创 2021-09-20 22:35:05 · 36 阅读 · 0 评论 -
堆排序算法
void buildmaxheap(int a[],int len){//建立大根堆o(n) for(int i=len/2;i>0;i--){ headadjust(a,i,len) }}void headadjust(int a[],int k,int len){ //将以k为根节点的子树进行调整 a[0]=a[k]; //a[0]暂存子树的根节点 for(i=2*k;i<=len;i*=2){ //沿着key较大的根节点向下筛选原创 2021-09-20 22:34:21 · 138 阅读 · 0 评论 -
选择排序算法
void selectsort(int a[],int n){ for(i=0;i<n-1;i++){ //进行n-1趟排序 min=i; //记录最小元素位置 for(j=i+1;j<n;j++) //在a[i……n]中选择最小元素 if(a[j]<a[min]) min=j; //更新最小元素 if(min!=i) swap(a[i],a[min]);//封装swap原创 2021-09-20 22:33:39 · 58 阅读 · 0 评论 -
快速排序算法
void quicksort(int a[],int low,int high){ if(low<high){ //递归跳出条件 int mid=partition(a,low,high); quicksort(a,low,mid-1); //依次对两个子表进行递归 quicksort(a,mid+1,high); }}int partition(int a[],int low,int high){ //一趟划分原创 2021-09-20 22:33:00 · 64 阅读 · 0 评论 -
冒泡排序算法
void bubble(int a[],int n){ for(i=0;i<n-1;i++){ flag=false; //本趟冒泡排序是否发生交换的标志 for(j=n-1;j>i,j--) //一趟冒泡排序过程 if(a[j-1]>a[j]){ //若为逆序 swap(a[j-1],a[j]);//交换 flag=true;原创 2021-09-20 22:30:54 · 36 阅读 · 0 评论 -
希尔排序算法
void shellsort(int a[],int n){ for(dk=n/2;dk>=1;dk=dk/2) //a[0]是暂存单元,不是梢兵,当就j<0时候,插入位置已到 for(i=dk+1;i<=n;++i) //步长变化 if(a[i]<a[i-dk]){ //将a[i]插入有序增量子表 a[0]=a[i]; //暂存在a[0] for(j=i-原创 2021-09-20 22:30:05 · 38 阅读 · 0 评论 -
线性表的顺序存储
#define maxsize 50; //定义线性表最大长度(静态)typedef struct{ elemtype data[maxsize]; int length;}sqlist原创 2021-09-20 22:25:51 · 39 阅读 · 0 评论 -
插入排序算法
void insertsort(int a[],int n){ int i,j; for(i=2;i<=n;i++) //依次插入2……n号元素 if(a[i]<a[i-1]){ //关键码小于前驱,将A[i]插入有序表 a[0]=a[i]; //复制为哨兵 for(j=i-1;a[0]<a[j];--j)//从后往前寻找待插入元素 a[j+原创 2021-09-20 22:26:57 · 47 阅读 · 0 评论