408数据结构算法题常见代码及真题答案(伪代码)

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顶点的数量    
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值