数据结构day7

一、思维导图

二、二叉树的创建、遍历

#ifndef BITREE_H
#define BITREE_H

#include<myhead.h>

typedef char datatype; 		//定义数据类型

//定义二叉树结点
typedef struct Node
{
	datatype data; 			//数据域

	struct Node *l_child; 	//左孩子指针
	struct Node *r_child; 	//右孩子结点
}Node,*BitreePtr;

//创建二叉树
BitreePtr bitree_create();

//二叉树的先序遍历
void preorder(BitreePtr B);

//二叉树的中序遍历
void inorder(BitreePtr B);

//二叉树的后序遍历
void postorder(BitreePtr B);



#endif
#include"bitree.h"

//创建二叉树
BitreePtr bitree_create()
{
	datatype data = 0;
	scanf(" %c",&data);

	if(data == '#') 		//递归出口
	{
		return NULL;
	}

	//申请结点空间
	BitreePtr p = (BitreePtr)malloc(sizeof(Node));
	if(NULL == p)
	{
		printf("申请失败\n");
		return NULL;
	}

	//将结点赋值
	p->data = data;

	//递归创建左子树
	p->l_child = bitree_create();

	//递归创建右子树
	p->r_child = bitree_create();

	//将根节点返回
	return p;
}

//二叉树的先序遍历
void preorder(BitreePtr B)
{
	//判断逻辑
	if(NULL == B)
	{
		return;
	}

	//输出结点数据域
	printf("%c\t",B->data);

	//先序遍历左子树
	preorder(B->l_child);

	//先序遍历右子树
	preorder(B->r_child);
}

//二叉树的中序遍历
void inorder(BitreePtr B)
{
	
	//判断逻辑
	if(NULL == B)
	{
		return;
	}

	//先序遍历左子树
	inorder(B->l_child);

	//输出结点数据域
	printf("%c\t",B->data);

	//先序遍历右子树
	inorder(B->r_child);

}

//二叉树的后序遍历
void postorder(BitreePtr B)
{
	//判断逻辑
	if(NULL == B)
	{
		return;
	}

	//先序遍历左子树
	postorder(B->l_child);

	//先序遍历右子树
	postorder(B->r_child);

	//输出结点数据域
	printf("%c\t",B->data);

}
#include"bitree.h"
int main(int argc, const char *argv[])
{
	//创建二叉树
	BitreePtr B = bitree_create();

	//先序遍历
	printf("先序遍历:");
	preorder(B);
	printf("\n");

	//中序遍历
	printf("中序遍历:");
	inorder(B);
	printf("\n");

	//后序遍历
	printf("后序遍历:");
	postorder(B);
	printf("\n");

	return 0;
}

三、排序算法

#include<myhead.h>

//数组的输出
void arr_print(int *arr,int len)
{
	for(int i=0;i<len;i++)
	{
		printf("%d\t",arr[i]);
	}
	printf("\n");
}

//冒泡排序
void bubble_sort(int *arr,int len)
{
	for(int i=1;i<len;i++)
	{
		int flag = 0; 				//定义标志位记录本轮是否移动数据
		for(int j=0;j<len-i;j++)
		{
			if(arr[j] > arr[j+1])
			{
				flag = 1;
				int temp = arr[j];
				arr[j] = arr[j+1];
				arr[j+1] = temp;
			}
		}

		//如果本轮没发生数据移动,则终止后续的轮次
		if(flag ==0)
			break;
	}	printf("排序成功\n");
}

//选择排序
void select_sort(int *arr,int len)
{
	int mini = 0; 					//定义最小值下标
	for(int i= 0;i<len;i++)
	{
		mini = i; 
		//每轮循环选出待排序的最值
		for(int j = i+1;j<len;j++)
		{	
			if(arr[j] < arr[mini])
			{
				//更新最值下标
				mini = j;
			}
		}

		//判断最值是否在当前轮次首位
		if(mini != i)
		{
			//如果不在首位交换二者的位置
			int temp = arr[i];
			arr[i] = arr[mini];
			arr[mini] = temp;
		}
	}	printf("排序成功\n");
}


//直接插入排序
void insert_sort(int *arr,int len)
{
	int i,j;  			//记录排序轮数和循环比较的位置

	for(int i=1;i<len;i++)
	{
		//从第待排序首位开始,拿第后一个和前一个比较
		int temp = arr[i];
		j = i-1;
		while(temp<=arr[j]&&j>=0)
		{
			if(temp < arr[j])
			{
				//将元素后移
				arr[j+1] = arr[j];
			}
			j--;
		}
		//将temp插入后移后的空中
		arr[j+1] = temp;
	}
	printf("排序成功\n");
}


//单趟快速排序返回基准值位置
int quick_sort_part(int *arr,int low,int high)
{
	//定义基准值位置
	int value = arr[low];

	//所有元素与基准值比较
	while(low < high)
	{
		//判断基准值后面的数值是否都大于基准值
		while( arr[high] >= value && high>low) 	//防止指针移动交叉
		{
			high--;
		}
		//将比基准值小的元素移动到基准值前
		arr[low] = arr[high];

		//判断基准值前面的数值是否都小于基准值
		while( arr[low] <= value && high>low) 	//防止指针移动交叉
		{
			low++;
		}
		//将比基准值大的元素移动到基准值后面
		arr[high] = arr[low];
	}

	//此时已经筛选出基准值
	arr[low] = value;
	
	//返回基准值下标
	return low;
}

//快速排序
void quick_sort(int *arr,int low,int high)
{
	//如果low大于high
	//递归出口
	if(low >= high)
	{
		return;
	}

	//调用单趟快速排序函数选出中间基准值
	int mid = quick_sort_part(arr,low,high);

	//对基准值左侧数据继续进行快速排序
	quick_sort(arr,low,mid-1);

	//对基准值右侧数据继续进行快速排序
	quick_sort(arr,mid+1,high);

}


int main(int argc, const char *argv[])
{
	int arr[] = {34,45,29,4,365,456,24,98};
	int len  =sizeof(arr)/sizeof(arr[0]);                                                                                                                                                                                                                               

	//冒泡排序
//	bubble_sort(arr,len);

	//选择排序
//	select_sort(arr,len);

	//直接插入排序
//	insert_sort(arr,len);

	//快速排序
	quick_sort(arr,0,len-1);
	printf("排序成功\n");

	//输出数组
	arr_print(arr,len);
	return 0;
}
  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值