一、思维导图
二、二叉树的创建、遍历
#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;
}