算法之二分搜索树C语言实现

这篇博客详细介绍了如何使用C语言实现二分搜索树算法。内容包括头文件binarySearch.h的定义以及对应的c代码binarySearch.c的具体实现。
摘要由CSDN通过智能技术生成

头文件 binarySearch.h

#ifndef BINARYSEARCH_H_INCLUDED
#define BINARYSEARCH_H_INCLUDED
#include "stdbool.h"
#include "stddef.h"
#include "stdlib.h"
#include "ASSERT.h"

typedef struct Node{
    int key;
    int value;

    struct Node *left;
    struct Node *right;


}Node;

typedef struct BST{
    struct Node *root;
    int count;
}BST;

int binarySearch(int arr[],int n,int target);
int binarySearch2(int arr[],int l,int r,int target);

void init_BST(BST *bst);
void insert_BST(BST *bst,int key,int value);

int size_BST(BST *bst);
int isEmpty_BST(BST *bst);

bool contain_BST(BST *bst,int key);
int* search_BST(BST *bst,int key);

int* preOrder_BST(BST *bst);
int* inOrder_BST(BST *bst);
int* postOrder_BST(BST *bst);

int min_BST(BST *bst);
int max_BST(BST *bst);

void removeMin_BST(BST *bst);
void removeMax_BST(BST *bst);

void remove_BST(BST *bst,int key);

#endif // BINARYSEARCH_H_INCLUDED

c代码 binarySearch.c

#include "binarySearch.h"


/*********************************************
*函数名:二分查找法,在有序数组中查找target
*        如果找到target就返回索引,否则返回-1
*********************************************/
int binarySearch(int arr[],int n,int target){
    //在arr[l,r]中查找target
    int l = 0,r = n-1;

    while(l <= r){
        //int mid = (l+r)/2;
        int mid = l + (r-l)/2;
        if(arr[mid] == target){
            return mid;
        }
        else if(arr[mid] > target){
            r = mid - 1;
        }
        else{
            l = mid + 1;
        }
    }
    return -1;

}

/*********************************************
*函数名:递归二分查找法,在有序数组中查找target
*        如果找到target就返回索引,否则返回-1
*********************************************/
int binarySearch2(int arr[],int l,int r,int target){
    //在arr[l,r]中查找target
    while(l <= r){
        //int mid = (l+r)/2;
        int mid = l + (r-l)/2;
        if(arr[mid] == target){
            return mid;
        }
        else if(target < arr[mid]){
            return binarySearch2(arr,l,mid-1,target);
        }
        el
最优二分检索(Optimal Binary Search Tree)是一种经典的数据结构,它是一种可以对键进行搜索的二叉,且中每个节点都有一个与之关联的数值,通常是一个键值和一个权值。它的主要特点是查询的时间复杂度为O(logn),效率非常高。同时,它可以通过动态规划的方法,构建出一棵,使得所有的查找操作所需的时间最小。 在C语言中,实现最优二分检索可以使用动态规划算法进行构建。其基本思路是:先按照给定的键值和权值构造一颗二叉搜索,然后计算出每个节点对应子的最小搜索代价,并选择最小代价来构造最优二分检索。通过动态规划的方法,可以将时间复杂度优化到O(n^3)。 下面是一个简单的C语言实现示例: ```c #include <stdio.h> #include <stdlib.h> #define MAX_N 100 int n; double p[MAX_N + 1]; // 数组p存储每个关键字被搜索到的概率 double q[MAX_N + 1]; // 数组q存储每个虚拟节点(即没有关键字)被搜索到的概率 double w[MAX_N + 1][MAX_N + 1]; // 数组w存储子i-j的概率和 double e[MAX_N + 1][MAX_N + 1]; // 数组e存储子i-j的最小代价 double root[MAX_N + 1][MAX_N + 1]; // 数组root存储子i-j最优二分检索的根节点 void optimal_bst() { for (int i = 1; i <= n + 1; i++) { w[i][i - 1] = q[i - 1]; e[i][i - 1] = q[i - 1]; } for (int len = 1; len <= n; len++) { for (int i = 1; i <= n - len + 1; i++) { int j = i + len - 1; e[i][j] = __DBL_MAX__; w[i][j] = w[i][j - 1] + p[j] + q[j]; for (int k = i; k <= j; k++) { double t = e[i][k - 1] + e[k + 1][j] + w[i][j]; if (t < e[i][j]) { e[i][j] = t; root[i][j] = k; } } } } } int main() { scanf("%d", &n); for (int i = 1; i <= n; i++) { scanf("%lf", &p[i]); q[i] = q[i - 1] + p[i]; } q[n + 1] = q[n]; optimal_bst(); printf("最小代价为:%lf\n", e[n]); printf("最优二分检索的根节点为:%lf\n", root[n]); return 0; } ```
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值