数据结构
ustcthebest
一直在这里,等风也等你
展开
-
L2-033 简单计算器 (25 分)
#include<bits/stdc++.h>using namespace std;int main(){ int N; stack<int>x; stack<char>y; cin>>N; for(int i=0;i<N;i++){ int t; cin>>t; x.push(t); } for(int i=0;i<N-1;i++){ char t; cin>>t; y.pus.原创 2022-04-21 20:59:44 · 278 阅读 · 0 评论 -
KMP模式匹配算法代码实现
#include<bits/stdc++.h>using namespace std;void Next(string t,int next[]){ int i=0,j=-1; next[0]=-1; while(i<t.length()-1){ if(j==-1||t[i]==t[j]){ //第一位不等或者s[i]和t[i]相等 i++;j++; //匹配下一位 next[i]=j; }else{ j=next[j]; } }}in.原创 2022-04-20 16:36:18 · 531 阅读 · 0 评论 -
图的深度搜索和广度搜索代码c
#include<iostream>#include<queue> using namespace std;typedef int VertexType;#define MaxVertexNum 100typedef int EdgeType;typedef struct{ VertexType Vex[MaxVertexNum]; EdgeType Edge[MaxVertexNum][MaxVertexNum]; int vexnum,arcnum; boo.原创 2022-04-18 22:26:17 · 496 阅读 · 0 评论 -
L2-021 点赞狂魔 (25 分)
#include<bits/stdc++.h>using namespace std;//创建结构体存储每个人,用集合来存储点赞的不同数据 ,在存储点赞的大小 typedef struct node{ set<int> s; string name; double sum;}; //比较大小 bool cmp(node a,node b){ if(a.s.size()>b.s.size()) //如果大于 return true; if(a.s.s.原创 2022-04-18 12:10:28 · 289 阅读 · 0 评论 -
二叉树转化为中缀表达式
void BtreeToExp(Tree T,int deep){ if(T==NULL){ return ; } else if(T->left==NULL&&T->right==NULL){ printf("%d",T->data); } else{ if(deep>1) cout<<"("; BtreeToExp(T->left,deep+1); printf("%d",T->data); Btree.原创 2022-04-15 22:20:10 · 1434 阅读 · 0 评论 -
2014 计算二叉树的带权路径长度
1)思想:设置全局变量sum统计权值之和①若该节点是叶子结点,则变量sum加上该节点深度和权值之积②若该节点是非叶子结点,左子树不空则递归调用左子树,右子树不空递归调用右子树,深度为本结点深度+1③最后输出sum值即可//带权路径长度int sum;int WPL(Tree T,int deep){ if(T->left==NULL&&T->right==NULL) { sum+=deep*(T->weight); //为根结...原创 2022-04-15 22:04:11 · 372 阅读 · 1 评论 -
删除以元素k为根的子树
思想:只要能删除其左,右子树就能释放值为x的结点,后序遍历删除。层序遍历查找值为k的父节点。需要完整遍历整科二叉树,所以时间复杂度是O(n)删除代码void DeleteTree(Tree &Q){ if(Q==NULL) return; //递归终止条件 DeleteTree(Q->lchild); DeleteTree(Q->rchild); free(Q);}查找代码void Findxdelete(Tree &T,int.原创 2022-04-15 21:36:17 · 393 阅读 · 0 评论 -
判断是否为完全二叉树
判断是否为完全二叉树的关键也是找到不饱和节点。思路:由于完全二叉树在每一层非空节点都是一个接一个连续分布的,不可能出现两个非空节点之间交叉一个空节点。通过层序遍历从上往下,从左往右将每一个节点(包括非空节点)都放到队列里在出队列的过程中,如果遇到空节点,则跳出循环跳出循环后,然后再判断队列中剩下的元素是否有非空节点:有非空节点:非完全二叉树;没有非空节点(全是空节点):完全二叉树。 #include<iostream>#include<stdlib.h&原创 2022-04-15 21:10:16 · 1510 阅读 · 0 评论 -
(先序和中序遍历创建二叉树)或者(中序和后序遍历创建二叉树)
#include<iostream>#include<stdlib.h>#include<bits/stdc++.h>#include<queue> #define ElemType intusing namespace std;typedef struct BiTNode{ ElemType data; struct BiTNode *lchild,*rchild;}TNode,*Tree;int treenum[]={1,2,4,0,.原创 2022-04-15 19:10:09 · 534 阅读 · 0 评论 -
二叉树的自下而上 ,自右而左遍历
#include<iostream>#include<stdlib.h>#include<bits/stdc++.h>#include<queue> #define ElemType intusing namespace std;typedef struct BiTNode{ ElemType data; struct BiTNode *lchild,*rchild;}TNode,*Tree;int treenum[]={1,2,4,0,.原创 2022-04-15 10:26:38 · 680 阅读 · 0 评论 -
有关二叉树的递归算法练习题6-10
#include<iostream>#include<stdlib.h>#include<bits/stdc++.h>#include<queue> #define ElemType intusing namespace std;typedef struct BiTNode{ ElemType data; struct BiTNode *lchild,*rchild;}TNode,*Tree;int treenum[]={1,2,4,0,.原创 2022-04-15 10:03:31 · 120 阅读 · 0 评论 -
二叉树的先序,中序,后序,层序遍历
#include<iostream>#include<stdlib.h>#include<queue> #define ElemType intusing namespace std;typedef struct BiTNode{ ElemType data; struct BiTNode *lchild,*rchild;}TNode,*Tree;int treenum[]={1,2,4,0,0,5,0,0,3,0,0};int k;void cr.原创 2022-04-14 10:06:05 · 662 阅读 · 0 评论 -
统计二叉树的高度和宽度
#include<iostream>#include<stdlib.h>#include<queue> #define ElemType int#define MaxSize 100using namespace std;typedef struct BiTNode{ ElemType data; struct BiTNode *lchild,*rchild;}TNode,*Tree;int treenum[]={1,2,4,0,0,5,0,0,3,.原创 2022-04-14 10:05:14 · 592 阅读 · 0 评论 -
有关二叉树的递归算法
//统计度为0的结点个数,其值用sum返回void leaf(BiTree T, int &sum){ if(T) { if(T->lchild==NULL && T->rchild==NULL ) sum++; leaf(T->lchild,sum); leaf(T->rchild,sum); } }...原创 2022-04-18 22:26:53 · 111 阅读 · 0 评论 -
如果一棵非空 k(k≥2)叉树 T 中每个非叶结点都有 k 个子,则称 T 为正则 k 叉树。请回答下列问题并给出推导过程。
(1)若 T 有 m 个非叶结点,则 T 中的叶结点有多少个?(2)若 T 的高度为 h(单结点的树 h=1),则 T 的结点数最多为多少个?最少为多少个?第一题解:(1)全部节点个数 = 叶子节点个数 + 非叶子节点个数(2)树边数 = 全部节点个数 - 1(3)树枝个数 = 全部节点的度数之和n=n0+nk = n0+m又因为每个非叶结点都有k个孩子,所以树的边数=mkn-1=mk两式联立得n0=mk-m+1第二题解:最多结点为满k叉树利用等比数列.原创 2022-04-13 12:10:40 · 5032 阅读 · 0 评论 -
请设计一个算法,将给定的表达式树(二叉树)转换为等价的中缀表达式(通过括号反映操作符的 计算次序)并输出。例如,当下列两棵表达式树作为算法的输人时
输出的等价中缀表达式分别为(a+b)*(c*(-d))和(a*b)+(-(c-d))。 二叉树结点定义如下: 1 2 3 4 5 typedef struct node{ char data[10]; //存储操作数或操作符 struct node *left, *right; } BTree; 要求:(1)给出算法的基本设计思想。(2)根据设计思想,采用 C ...原创 2022-04-11 21:54:11 · 2502 阅读 · 0 评论 -
求二叉树的带权路径长度问题
解析:考察二叉树带权路径问题,二叉树的带权路径长度问题为每个叶结点的深度与权值之积的总和。先序遍历的时候需要采用递归调用来进行二叉树的遍历,把每个结点的深度作为递归函数的一个参数进行传递.具体步骤如下:若当前访问结点是叶结点,则总长度加上该结点的深度与权值之积若该结点是非叶结点,若左子树不为空,递归调用左子树,若右子树不为空,递归调用右子树,直至最后返回总长度typedef struct BiNode{ int weight; struct BiTNode *lchild,rchi..原创 2022-04-11 21:31:46 · 763 阅读 · 0 评论 -
后序遍历二叉树的非递归算法
初始化一个空栈。1.当【根节点不空】或【栈不空】时,开始循环2.每次将当前节点压入栈中,如果当前节点有左子树,就找到左下,没有左子树就掉头右子树。若当前节点无左子树也无右子树,从栈中弹出该节点,此时的栈顶元素如果是上一个节点的左节点尝试访问上个节点的右子树,如果不是,那当前栈的栈顶元素继续弹出。void PostOrder(BiTree root){{ BiTree p; stack<int>s; vector<int>Tree; while(root原创 2022-04-11 20:59:07 · 562 阅读 · 0 评论 -
若某非空二叉树的先序序列和后序序列正好相反,或者正好相同,则二叉树形态是怎么样的?
相反:可以得出结论左子树或者右子树为空,且树的高度等于结点个数相同:只有可能为只有根节点原创 2022-04-11 20:25:26 · 7383 阅读 · 0 评论 -
中序二叉树实现线索化
#include<bits/stdc++.h>using namespace std;typedef struct ThreadNode{ int data; struct ThreadNode *lchild,*rchild; int ltag,rtag; //ltag为0时指向结点左孩子,为1时指向结点前驱; //rtag为0时指向结点右孩子,为1时指向结点后继;}ThreadNode,*ThreadTree;ThreadTree pre;/* 中序线索化,其实就是修改.原创 2022-04-10 22:47:02 · 318 阅读 · 0 评论 -
串的朴素匹配算法
主串长度为n,模式串长度为m朴素模式匹配算法:长度 while(i<=S.length&&j<=T.length){ if(S.ch[i]==T.ch[i]){ i++;j++; } else{ i=i-j+2; j=1; } } if(j>T.length) return i-T.length; else return 0;原创 2022-04-05 22:21:31 · 130 阅读 · 0 评论 -
数据结构(串的基本操作)
#include<iostream>#include<stdlib.h>using namespace std;#define MAXLEN 255typedef struct{ char ch[MAXLEN]; int length;}SString;typedef struct{ char *ch; int length;}HString;typedef struct StringNode{ char ch; struct StringNode *n.原创 2022-04-05 20:58:38 · 759 阅读 · 0 评论 -
栈的应用(字符匹配)
#include<bits/stdc++.h>using namespace std;#define MaxSize 10typedef struct{ char data[MaxSize]; int top;}SqStack;bool bracketCheck(char str[],int length){ SqStack s; s.top=0; for(int i=0;i<length;i++){ if(str[i]=='('||str[i]=='{'||st.原创 2022-04-02 20:51:38 · 433 阅读 · 0 评论 -
数据结构(队列链式存储)
#include<iostream>#include<stdlib.h>#include<algorithm>#include<vector>#include<map>#define ElemType int#define MaxSize 100 using namespace std;typedef struct LinkNode{ ElemType data; struct LinkNode *next; }LinkNo.原创 2022-04-01 21:09:17 · 689 阅读 · 0 评论 -
数据结构队列(循环队列)
#include<iostream>#include<stdlib.h>#include<algorithm>#include<vector>#include<map>#define ElemType int#define MaxSize 100 using namespace std;typedef struct{ ElemType data[MaxSize]; int front,rear; //waste stora.原创 2022-04-01 20:19:38 · 694 阅读 · 0 评论 -
假设以I和O分别表示入栈和出栈操作。栈的初态和终态均为空,入栈和出栈的操作序列可表示为仅由I和O组成的序列,称可以操作的序列为合法序列,否则称为非法序列。
①下面所示的序列中哪些是合法的?A. IOIIOIOO B. IOOIOIIO C. IIIOIOIO D. IIIOOIOO②通过对①的分析,写出一个算法,判定所给的操作序列是否合法。若合法,返回true,否则返回false(假定被判定的操作序列已存入一维数组中)。#include<iostream>#include<stdlib.h>#include<algorithm>using namespace std;bool Judge(){原创 2022-03-31 21:02:42 · 6660 阅读 · 1 评论 -
c++数据结构栈的链式结构
#include<iostream>#include<stdlib.h>using namespace std;typedef struct Linknode{ int data; struct Linknode *next;} StackNode,*SqStack; SqStack InitStack(SqStack&L){ L=new StackNode; L->data=1; L->next=NULL; return L; }.原创 2022-03-30 22:21:00 · 662 阅读 · 0 评论 -
c++数据结构实现双向链表
#include<iostream>#include<stdlib.h>using namespace std;#define ElemType int// the discrepancy between linear list and double linked list is the pointer,// the double linked have two pointers that the first is prior that make visit front.原创 2022-03-30 21:50:20 · 1361 阅读 · 0 评论 -
数据结构链表的增删查改(带头结点)
#include<iostream>#include <stdio.h>#include <stdlib.h>using namespace std;typedef struct LNode{ int data; struct LNode *next;}LNode,*LinkList;LinkList InitList(LinkList &L){ // It have the head list and the head node is n.原创 2022-03-29 21:05:00 · 422 阅读 · 0 评论 -
数据结构(线性表)从有序顺序表中删除所有其值重复的元素,使表中所有元素的值均不同。
#include<bits/stdc++.h>using namespace std; int main(){ int data[]={1,2,2,2,2,2,3,3,4,4,5}; int lenghth=11; int i,j; for(i=0,j=1;j<lenghth;j++){ if(data[i]!=data[j]) data[++i]=data[j]; } lenghth=i+1; for(int k=0;k<lenghth;k.原创 2022-03-20 21:55:24 · 2234 阅读 · 0 评论