数据结构day6

1、思维导图

https://www.zhixi.com/view/4aaa42a3

2、二叉树实现

#include "tree.h"
//创建结点
ptree create_node(datatype data)
{
    ptree node = (ptree)malloc(sizeof(tnode));
    if(node==NULL)
    {
        return NULL;
    }
    node->data = data;
    node->right = NULL;
    node->left = NULL;
    return node;
}
//创建树,(根节点的左右子树仍然是一个二叉树)
ptree create_tree()
{
    //给新的结点申请空间
    //二叉树中结点的数据
    char data = '\0';
    scanf(" %c",&data);   //从终端获取二叉树中结点的值
    if(data=='#')
    {
        return NULL;
    }
    ptree T = create_node(data);
    T->left = create_tree();
    T->right = create_tree();     //根节点的左子树,仍然是一颗需要根节点的二叉树
    return T;
}
//先序遍历:根左右
void pri(ptree T)
{
    if(T==NULL)
    {
        return ;
    }
    printf("%c",T->data);
    pri(T->left);
    pri(T->right);
    return ;
}
//中序遍历:左根右
void mid(ptree T)
{
    if(T==NULL)
    {
        return ;
    }
    mid(T->left);   //调用左子树的中序
    printf("%c",T->data);  //输出根节点
    mid(T->right);  //调用右子树的中序
    
}
//后序遍历(左右根)
void last(ptree T)
{
    if(T==NULL)
    {
        return ;
    }
    last(T->left);
    last(T->right);
    printf("%c",T->data);
}

3、冒泡排序

for(i=1;i<len;i++)
{
    for(j=0;j<len-i;j++)
    {
        if(arr[j]>arr[j+1])
        {
            temp=arr[j];
            arr[j]=arr[j+1];
            arr[j+1]=temp;        
        }    
    }
}

4、选择排序

for(i=1;i<len;i++)
{
    min_index=i-1;    //每次排序前都要给最小值的下标重新赋值
    for(j=i;j<len;j++)
    {
        if(arr[j]<arr[min_index])
        {
            min_index = j;  //更新最小值的下标        
        }    
    }
    temp = arr[min_index];
    arr[min_index] = arr[i-1];  //i-1是待排序序列中第一个元素的下标
    arr[i-1] = temp;
}

5、快速排序

#include <stdio.h>
#include <stdlib.h>
#include <string.h>
//一次快速排序的函数,返回值是最后基准的下标
int one_sort(int *arr,int low,int high)
{
    //定义一个标准元素
    int base = arr[low];
    while(high>low)
    {
        while(arr[high]>base&&high>low)  //如果high下标的元素比基准更大,继续向前寻找不符合条件的元素
        {
            high--;
        }
        arr[low]=arr[high];  //找到high位置上比base更小的元素,赋值给low位置

        while(arr[low]<base&&high>low)
        {
            low++;
        }
        //找到了在low位置上比base更大的元素,赋值给high位置 
        arr[high]=arr[low];
    }
    arr[low]=base;
    return low;
}

//整体快排的代码
void sort(int *p,int low,int high)
{
    //当传过来的low<high说明数组是无序的
    if(high>low)
    {
        //接收一次快排的结果,对一次快排后,基准两侧的序列再排序
        int ret = one_sort(p,low,high);
        sort(p,low,ret-1);
        sort(p,ret+1,high);
    }
}
int main(int argc, const char *argv[])
{
    int arr[]={12,90,1,23,56,43,9};
    int len = sizeof(arr)/sizeof(int);
    sort(arr,0,len-1);
    int i;
    for(i=0;i<len;i++)
    {
        printf("%d\n",arr[i]);
    }
    return 0;
}

6、二叉树遍历

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值