408代码(未完待续)
请注意以下均为伪代码(考试专用),上机代码请自己编写!
结构体定义
二叉树定义
typedef struct BiTNode{
int data;
struct BiTNode *lchild,*rchild;
}BiTNode,*BiTree;
单链表定义
typedef struct LNode{
int data;
struct LNode *next;
}LNode,*LinkList;
顺序表定义
#define MaxSize 20
typedef struct {
int data[MaxSize];//表元素
int length;//表长度
} SeqList;
创建虚拟数组
int *A = (int*)malloc(sizeof(int)*n) //创建n个int型大小的数组
图的定义
邻接矩阵
//邻接矩阵
typedef struct {
int numVertices, numEdges;
char VerticesList[MAXV];
int Edge[MAXV][MAXV];
}Graph;
邻接表
typedef struct ArcNode{
int adjvex; //该弧所指向的顶点
int data; //边权值
struct ArcNode *nextarc; //指向下一条弧的指针
}ArcNode; //边结点
typedef struct{
VertexType data; //顶点信息,考试中一般不需要这部分
ArcNode *firstarc; //指向第一条依附该顶点的弧的指针
}VNode; //顶点结点
typedef struct{
VNode AdjList[MAXV]; //顶点数组
int vexnum, arcnum; //图的当前顶点数和弧数
}MGraph;
快排算法
空间复杂度 O(log2n) 时间复杂度O(nlog2n)
// 快速排序
void Q_sort(int A[], int L, int R) {//L,R分别为数组最左端最右端的index
if (L >= R) // 当前区间元素个数<=1则退出
return;
int i = L, j = R;
int pivot = A[L]; // pivot 作为基准值参与比较
while (i < j) {
while (i < j && A[j] >= pivot)
j--;
while (i < j && A[i] <= pivot)
i++;
if (i < j)
swap(&A[i], &A[j]); // A[j]<=pivot<A[i],交换
}
swap(&A[L], &A[i]); // 将基准值放入他的最终位置
Q_sort(A, L, i - 1); // 递归处理左区间
Q_sort(A, i + 1, R); // 递归处理右区间
}
链表
链长
//求表长长度
int ListLength(LinkList head) {
head=head->next;
int count=0;
while(head!=NULL) {
count++;
head=head->next;
}
return count;
}
二叉树
先序遍历
void PreOrder(BiTree T){
if (T!=NULL){
visit(T);//访问根结点
PreOrder(T.lchild); //递归遍历左子树
PreOrder(T.rchild); //递归遍历右子树
}
}
中序遍历
void InOrder(BiTree T){
if (T!=NULL){
InOrder(T.lchild); //递归遍历左子树
visit(T);//访问根结点
InOrder(T.rchild); //递归遍历右子树
}
}
后序遍历
void PostOrder(BiTree T){
if (T!=NULL){
PostOrder(T.lchild); //递归遍历左子树
PostOrder(T.rchild); //递归遍历右子树
visit(T);//访问根结点
}
}
树的高度
int height=0;
void PreOrder(BiTree T,int deep){//deep初值为1
if(T==NULL)return;
if(deep>height)height=deep;
PreOrder(T->left,deep+1);
PreOrder(T-right,deep+1);
}
树的宽度
int width[MAX];
void PreOrder(BiTree T,int n){
if(T==NULL)return;
width[n]++;
PreOrder(T->left,n+1);
PreOrder(T->Right,n+1);
}
int treeWidth(BiTree T){
for(int i=0;i<MAX;i++)width[i]=0;
PreOrder(T,0);
int max=-1;
for(int i=0;i<MAX;i++){
if(max<width[i])max=width[i];
}
return max;
}
树的WPL
int wpl=0;
void PreOrder(BiTree T,int deep){//deep初值为0
if(T==NULL)return;
if(T->left==NULL && T->right==NULL){
wpl+=deep*(T->weight);
}
PreOrder(T->left,deep+1);
PreOrder(T->right,deep+1);
}
二叉排序树的判断
bool SortTree(BiTree T,int low,int high){//low,high分别为负无穷大、正无穷大
if(T==NULL)//T为空肯定是二叉排序树
return true;
if(T->data>=high || T->data<=low)
return false;
bool a=SortTree(T,low,T->data);//遍历左子树
bool b=SortTree(T,T->data,high);//遍历右子树
return a&&b;
}
平衡二叉树的判断
bool isBalanced=true;//初始为true
int PostOrder(BiTree T){
if(T==NULL)return 0;
int l=PostOrder(T->left);//左子树的高度
int r=PostOrder(T->right);//右子树的高度
if(abs(l-r)>1)isBalanced=false;
if(l>r)return l++;//树的高度为左右子树的最大高度+1
else return r++;
}
408算法题答案
2013
int element(int A[],int n){
int *B = (int*)malloc(sizeof(int)*n);//创建虚拟数组
for(int i=0;i<n;i++)
B[i]=0;
for(int j=0;j<n;j++)//B记录元素出现的次数
B[A[j]]++;
for(int k=0;k<n;k++)
if(B[k] > n/2)
return k;//下标即为元素
return -1;
}
2014
typedef struct BiNode {
int weight;
struct BiNode *left,*right;
} BiNode,*BiTree;
int wpl=0;
void PreOrder(BiTree root,int deep) {
if(root==NULL)return;
if(root->left ==NULL &&root->right ==NULL)//是否为叶节点
wpl+=deep*root->weight;
PreOrder(root->left,deep+1);
PreOrder(root->right,deep+1);
}
2022
bool func(SqBiTree T,int i,int low,int high){//i初值为0,low,high分别为负无穷大、正无穷大
if(i>=ElemNum || T.SqBiTNode[i]==-1)//i超过了数组元素个数或结点为空
return true;
if(T.SqBiTNode[i]>=high || T.SqBiTNode[i]<=low)
return false;
bool a=func(T,2*i+1,low,T.SqBiTNode[i]);//遍历左子树
bool b=func(T,2*i+2,T.SqBiTNode[i],high);//遍历右子树
return a&&b;
2023
邻接表做法(非真题做法)
int indegree[MAXV]={0};//入度数组
int printVertices(MGraph G){
int k=0;//k顶点个数
// 初始化入度数组
for (int i = 0; i < G.vexnum; i++) {
ArcNode *p = G.AdjList[i].firstarc;
while (p != NULL) {
indegree[p->adjvex]++; // 更新入度
p = p->nextarc;
}
}
// 遍历顶点,计算出度并检查是否为K顶点
for (int i = 0; i < G.vexnum; i++) {
int outdegree = 0;
ArcNode *p = G.AdjList[i].firstarc;
while (p != NULL) {
outdegree++; // 计算出度
p = p->nextarc;
}
// 如果出度大于入度,则打印该顶点
if (outdegree > indegree[i]) {
printf("K顶点: %d\n", i);
k++;
}
}
return k; // 返回K顶点的数量
}