数据结构算法题整理2

1.将一个线性表中所有奇数移到偶数之前的算法

#include<stdio.h>

void move_odd(int r[],int s,int t)
{
	int i=s,j=t,x=r[s];
	while(i<j)
	{
		while(i<j && r[j]%2==0)j--;if(i<j){r[i]=r[j];i++;}
		while(i<j && r[i]%2==1)i++;if(i<j){r[j]=r[i];j--;}
	}
	r[i]=x;
}

void traverse_array(int a[],int n)
{
	int i;
	for(i=0;i<n;i++)
		printf("%3d",a[i]);
	printf("\n");
}

void main()
{
	int a[9]={1,2,3,4,5,6,7,8,9};
	traverse_array(a,9);
	move_odd(a,0,8);
	traverse_array(a,9);
}

在这里插入图片描述

2.链式存储二叉树,在二叉树中查找某元素,如果二叉排序树中存在该元素则函数结束,否则插入该元素
#include<stdio.h>
#include<stdlib.h>

typedef struct BiTNode
{
	int data;
	struct BiTNode *lchild,*rchild;
}BiTNode,*BiTree;

void initBiTree(BiTree *BT)
{
	(*BT)=(BiTree)malloc(sizeof(BiTNode));
	(*BT)->lchild=(BiTree)malloc(sizeof(BiTNode));
	(*BT)->rchild=(BiTree)malloc(sizeof(BiTNode));
	(*BT)->data=5;
	(*BT)->lchild->data=4;
	(*BT)->rchild->data=6;
	(*BT)->lchild->lchild=NULL;
	(*BT)->lchild->rchild=NULL;
	(*BT)->rchild->lchild=NULL;
	(*BT)->rchild->rchild=NULL;
}


void MidOrder(BiTree T)
{
	if(T)
	{
		MidOrder(T->lchild);
		printf("%3d",T->data);
		MidOrder(T->rchild);
	}
}

//二叉搜索树的非递查找归算法
int Find(BiTree T,int item)
{
	while(T)
	{
		if(item==T->data)
			return 1;
		else if(item<T->data)
			T=T->lchild;
		else T=T->rchild;
	}
	return -1;
}


//在二叉树中查找某元素,如果二叉排序树中存在该元素则函数结束,否则插入该元素

int BSTInsert(BiTree *T,int key)
{
	if((*T)==NULL)
	{
		(*T)=(BiTree)malloc(sizeof(BiTNode));
		(*T)->data=key;
		(*T)->lchild=(*T)->rchild=NULL;
		return 1;		
	}
	else if(key==(*T)->data)
	{
		return 0;
	}
	else if(key<(*T)->data)
	{
		return BSTInsert(&(*T)->lchild,key);  //在左子树查找
	}
	else
	{
		return BSTInsert(&(*T)->rchild,key);  //在右子树中查找
	}
}

int main()
{
	BiTree T;
	initBiTree(&T);
	MidOrder(T);
	if(Find(T,6))printf("查找成功\n");
	BSTInsert(&T,3);
	MidOrder(T);
	return 0;
}

在这里插入图片描述
3.辗转相除法求最大公约数

#include<stdio.h>


int greatestCommonDivisor(int a,int b)
{
	int w,t,p;
	w=a*b;
	while(b!=0)   //辗转相除法
	{
		if(a<b)
		{
			p=a;
			a=b;
			b=p;
		}
		t=a%b;
		a=b;
		b=t;
	}
	return a;
}

int main()
{
	printf("greatestCommonDivisor(12,36) is %d\n",greatestCommonDivisor(12,36));
	printf("leastCommonMultiple(12,36) is %d\n",12*36/greatestCommonDivisor(12,36));
	return 0;
}

在这里插入图片描述
4.按升序合并两个有序链表

#include<stdio.h>
#include<stdlib.h>

typedef struct node
{
	int data;
	struct node *next;
}node,*LinkList;


//头插法初始化链表
void build_node(LinkList *head,int a[],int n)
{
	int i;
	node *p;
	(*head)=(node *)malloc(sizeof(node));
	(*head)->data=a[0];
	p=(node *)malloc(sizeof(node));
	p->data=a[n-1];
	p->next=NULL;
	(*head)->next=p;
	for(i=1;i<n-1;i++)
	{
		p=(node *)malloc(sizeof(node));
		p->data=a[8-i];
		p->next=(*head)->next;
		(*head)->next=p;
	}
}

void traverse_node(node *head)
{
	node *p=head;
	while(p)
	{
		printf("%6d",p->data);
		p=p->next;
	}
	printf("\n");
}

void traverse_array(int a[],int n)
{
	int i;
	for(i=0;i<n;i++)
		printf("%3d",a[i]);
	printf("\n");
}

//两个有序单链表的合并排序算法
void MergeLinkList(LinkList ha,LinkList hb,LinkList *hc)
{
	LinkList s=(*hc)=0;
	while(ha!=0 && hb!=0)
		if(ha->data<hb->data)
		{
			if(s==0)
				(*hc)=s=ha;
			else{s->next=ha;s=ha;}   
			ha=ha->next;
		}
		else
		{
			if(s==0)
				(*hc)=s=hb;
			else{s->next=hb;s=hb;}
			hb=hb->next;
		}		
	if(ha==0) s->next=hb; else s->next=ha;	
}

void main()
{
	LinkList La,Lb,Lc,*p;
	int a[9]={1,3,21,52,81,411,1311,11000,63000};
	int b[9]={8,31,72,511,820,900,1300,1311,1500};
	build_node(&La,a,9);
	build_node(&Lb,b,9);
	traverse_node(La);
	traverse_node(Lb);
	MergeLinkList(La,Lb,&Lc);
	traverse_node(Lc);
}

在这里插入图片描述
5.按升序合并两个有序顺序表

#include<stdio.h>

void traverse_array(int a[],int n)
{
	int i;
	for(i=0;i<n;i++)
		printf("%3d",a[i]);
	printf("\n");
}


//两个有序顺序表合并按升序合并为一个顺序表
void mergeSq(int a[],int len_a,int b[],int len_b,int c[])
{
	
	int i=0,j=0,k=0;
	while(i<len_a && j<len_b)
	{
		if(a[i]<=b[j])
		{
			c[k]=a[i];++i;
		}
		else
		{
			c[k]=b[j];++j;
		}
		k++;
	}

	while(i<len_a)
		c[k++]=a[i++];
	while(j<len_b)
		c[k++]=b[j++];
}

void main()
{
	int a[9]={1,3,2,4,43,51,63};
	int b[9]={8,9,17,25,38,39,43,44,75};
	int c[16];
	traverse_array(a,7);
	traverse_array(b,9);
	mergeSq(a,7,b,9,c);
	traverse_array(c,16);
}

在这里插入图片描述
6.判断二叉树A中是否有自树的结构和树B一样

#include<stdio.h>
#include<stdlib.h>

typedef struct BiTNode
{
	int data;
	struct BiTNode *lchild,*rchild;
}BiTNode,*BiTree;

void initBiTree(BiTree *BT)
{
	(*BT)=(BiTree)malloc(sizeof(BiTNode));
	(*BT)->lchild=(BiTree)malloc(sizeof(BiTNode));
	(*BT)->rchild=(BiTree)malloc(sizeof(BiTNode));
	(*BT)->data=5;
	(*BT)->lchild->data=4;
	(*BT)->rchild->data=6;
	(*BT)->lchild->lchild=NULL;
	(*BT)->lchild->rchild=NULL;
	(*BT)->rchild->lchild=NULL;
	(*BT)->rchild->rchild=NULL;
}

void preOrder(BiTree T)
{
	if(T)
	{
		printf("%3d",T->data);
		preOrder(T->lchild);
		preOrder(T->rchild);
	}
}

bool isSubTree(BiTree T1,BiTree T2)
{
	if(T2==NULL)return true;
	if(T1==NULL && T2!=NULL)return false;
	if(T1->data=T2->data)
		return isSubTree(T1->lchild,T2->lchild) && isSubTree(T1->rchild,T2->rchild);
	return false;
}

bool HasSubtree(BiTree T1,BiTree T2)
{
	if(T2==NULL)return false;
	if(T1==NULL && T2!=NULL)return false;
	bool flag=false;
	if(T1->data==T2->data)
		flag=isSubTree(T1,T2);
	return flag||HasSubtree(T1->lchild,T2->lchild)||HasSubtree(T1->rchild,T2->rchild);
}

void main()
{
	BiTree T1,T2,T3;
	initBiTree(&T1);
	initBiTree(&T2);
	T3=(BiTree)malloc(sizeof(BiTNode));
	T3->data=4;
	T3->lchild=0;
	T3->rchild=0;
	preOrder(T1);
	if(HasSubtree(T1,T2))
	printf("T1 has subTree T2\n");
	if(HasSubtree(T1,T3))
	printf("T1 has subTree T3\n");
}

在这里插入图片描述
7.统计一个数组中相同元素的个数

#include<stdio.h>

void traverse_array(int a[],int n)
{
	int i;
	for(i=0;i<n;i++)
		printf("%3d",a[i]);
	printf("\n");
}

void countArrayElement(int *a,int n)
{
	int count=0;
	for(int i=0;i<n;i++)	
	{
		for(int j=0;j<n;j++)
		{
			if(a[i]==a[j])
				count++;
		}
		printf("array element %d has %d\n",a[i],count);
		count=0;
	}
}

void main()
{
	int b[9]={8,9,17,25,8,39,43,8,75};
	traverse_array(b,9);
	countArrayElement(b,9);
}

在这里插入图片描述
8.设计在链式存储结构上交换二叉树中所有左右子树的算法

#include<stdio.h>
#include<stdlib.h>

typedef struct BiTNode
{
	int data;
	struct BiTNode *lchild,*rchild;
}BiTNode,*BiTree;

void initBiTree(BiTree *BT)
{
	(*BT)=(BiTree)malloc(sizeof(BiTNode));
	(*BT)->lchild=(BiTree)malloc(sizeof(BiTNode));
	(*BT)->rchild=(BiTree)malloc(sizeof(BiTNode));
	(*BT)->data=5;
	(*BT)->lchild->data=4;
	(*BT)->rchild->data=6;
	(*BT)->lchild->lchild=NULL;
	(*BT)->lchild->rchild=NULL;
	(*BT)->rchild->lchild=NULL;
	(*BT)->rchild->rchild=NULL;
}

void preOrder(BiTree T)
{
	if(T)
	{
		printf("%3d",T->data);
		preOrder(T->lchild);
		preOrder(T->rchild);
	}
}

void swapbitree(BiTree BT)
{
	BiTree p;
	if(BT==0)return;
	swapbitree(BT->lchild);swapbitree(BT->rchild);
	p=BT->lchild;BT->lchild=BT->rchild;BT->rchild=p;
}

void main()
{
	BiTree T;
	initBiTree(&T);
	preOrder(T);
	swapbitree(T);
	preOrder(T);
}

在这里插入图片描述

9.交换数组a1a2…amb1b2…bmc1c2…cm为c1c2…bm…b2b1a1a2…am

#include<stdio.h>

void traverse_array(int a[],int n)
{
	int i;
	for(i=0;i<n;i++)
		printf("%3d",a[i]);
	printf("\n");
}


void reverseA(int array[],int left,int right)
{
	int temp,mid,i;
	mid=(right-left)/2;
	for(i=0;i<=mid;i++)
	{
		temp=array[left+i];
		array[left+i]=array[right-i-1];
		array[right-i-1]=temp;
	}
}

void main()
{
	int array[9]={1,2,3,4,5,6,7,8,9};
	traverse_array(array,9);
	reverseA(array,0,9);
	reverseA(array,0,3);
	reverseA(array,6,9);
	traverse_array(array,9);
}

在这里插入图片描述

9.1采用以下办法时间复杂度可以更小

#include<stdio.h>

void traverse_array(int a[],int n)
{
	int i;
	for(i=0;i<n;i++)
		printf("%3d",a[i]);
	printf("\n");
}

void reverseA(int array[],int left,int right)
{
	int temp,mid,i;
	mid=(right-left)/2;
	for(i=0;i<=mid;i++)
	{
		temp=array[left+i];
		array[left+i]=array[right-i-1];
		array[right-i-1]=temp;
	}
}

void swapArray(int array[],int n)
{
	int tmp;
	for(int i=0;i<n/3;i++)
	{
		tmp=array[i];
		array[i]=array[i+2*n/3];
		array[i+2*n/3]=tmp;
	}
}

void main()
{
	int array[9]={1,2,3,4,5,6,7,8,9};
	traverse_array(array,9);
	swapArray(array,9);
	reverseA(array,3,6);
	traverse_array(array,9);
}

10.求二叉树根结点左右子树相隔最远的叶子结点之间的距离

#include<stdio.h>
#include<stdlib.h>

typedef struct BiTNode
{
	int data;
	struct BiTNode *lchild,*rchild;
}BiTNode,*BiTree;

int i=0;
void create_binary_tree(BiTree *T)
{
	printf("create binary tree\n");
	int a;
	scanf("%d",&a);
	if(a==0)(*T)=NULL;

	else
	{
		(*T)=(BiTree)malloc(sizeof(BiTNode));
		(*T)->data=a;
		create_binary_tree(&(*T)->lchild);
		create_binary_tree(&(*T)->rchild);
	}	
}

void preOrder(BiTree T)
{
	if(T)
	{
		printf("%3d",T->data);
		preOrder(T->lchild);
		preOrder(T->rchild);
	}
}

void MidOrder(BiTree T)
{
	if(T)
	{
		
		MidOrder(T->lchild);
		printf("%3d",T->data);
		MidOrder(T->rchild);
	}
}

int Distance(BiTree T)
{
	if(T==NULL)
		return -1;  //空结点高度不计
	int Ltree=Distance(T->lchild)+1;  //左子树高度+1
	int Rtree=Distance(T->rchild)+1;  //右子树高度+1
	int LRdistance=Ltree+Rtree;
	return LRdistance;
}

void main()
{
	BiTree T;
	create_binary_tree(&T);
	preOrder(T);
	MidOrder(T);
	int m=Distance(T);
	printf("%d",m);
}

在这里插入图片描述

  • 3
    点赞
  • 11
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值