/********************************************************************************************************
*
*
* 设计BST二叉查找树的接口,为了方便对二叉树进行节点的增删,所以采用双向不循环链表实现,每个节点内部都需要
* 有2个指针,分别指向该节点的左子树(lchild)和右子树(rchild)
*
*
*
* Copyright (c) 2023-2024 cececlmx@126.com All right Reserved
* ******************************************************************************************************/ #include <stdio.h>
#include <stdlib.h>
#include <stdbool.h> #include "drawtree.h" #if 0
//指的是BST树中的结点有效键值的数据类型,用户可以根据需要进行修改
typedef int DataType_t; //构造BST树的结点,BST树中所有结点的数据类型应该是相同的
typedef struct BSTreeNode
{
DataType_t data; //节点的键值
struct BSTreeNode *lchild; //左子树的指针域
struct BSTreeNode *rchild; //右子树的指针域 }BSTnode_t;
#endif //创建一个带根节点的BST树,对BST树的根节点进行初始化
BSTnode_t * BSTree_Create(DataType_t KeyVal)
{
//1.创建一个根结点并对根结点申请内存
BSTnode_t *Root = (BSTnode_t *)calloc(1,sizeof(BSTnode_t));
if (NULL == Root)
{
perror("Calloc memory for Root is Failed");
exit(-1);
} //2.对根结点进行初始化,根节点的2个指针域分别指向NULL
Root->data = KeyVal;
Root->lchild = NULL;
Root->rchild = NULL; //3.把根结点的地址返回即可
return Root;
} //创建新的结点,并对新结点进行初始化(数据域 + 指针域)
BSTnode_t * BSTree_NewNode(DataType_t KeyVal)
{
//1.创建一个新结点并对新结点申请内存
BSTnode_t *New = (BSTnode_t *)calloc(1,sizeof(BSTnode_t));
if (NULL == New)
{
perror("Calloc memory for NewNode is Failed");
return NULL;
} //2.对新结点的数据域和指针域(2个)进行初始化
New->data = KeyVal;
New->lchild = NULL;
New->rchild = NULL; return New;
} //向BST树中加入节点 规则:根节点的左子树的键值都是比根节点小的,根节点的右子树的键值都是比根节点大的
bool BSTree_InsertNode(BSTnode_t *Root,DataType_t KeyVal)
{ //为了避免根节点地址丢失,所以需要对地址进行备份
BSTnode_t *Proot = Root; //1.创建新节点并对新结点进行初始化
BSTnode_t * New = BSTree_NewNode(KeyVal);
if (NULL == New)
{
printf("Create NewNode Error\n");
return false;
} //2.此时分析当前的BST树是否为空树,有2种情况(空树 or 非空树)
if (NULL == Root)
{
//此时BST树为空树,则直接把新节点作为BST树的根节点
Root = New;
}
else
{
while(Proot)
{ //新节点的键值和根节点的键值进行比较,如果相等则终止函数
if (Proot->data == New->data)
{
printf("Can Not Insert,.....\n");
return false;
}
//新节点的键值和根节点的键值进行比较,如果不相等继续分析
else
{
//新节点的键值小于根节点的键值,则把根节点的左子树作为新的根
if( New->data < Proot->data )
{
if (Proot->lchild == NULL)
{
Proot->lchild = New;
break;
} Proot = Proot->lchild; }
else
{
if (Proot->rchild == NULL)
{
Proot->rchild = New;
break;
} Proot = Proot->rchild;
}
}
} } return true;
} int main(int argc, char const *argv[])
{
//1.创建一个带根节点的BST树
BSTnode_t *root = BSTree_Create(10); //2.向BST树中插入新节点
BSTree_InsertNode(root,5);
BSTree_InsertNode(root,20);
BSTree_InsertNode(root,7);
BSTree_InsertNode(root,12);
BSTree_InsertNode(root,8);
BSTree_InsertNode(root,3);
BSTree_InsertNode(root,25);
BSTree_InsertNode(root,11); return 0;
}

BST二叉查找树的接口设计的更多相关文章

  1. 数据仓储之DLL层接口设计

    一.接口设计 1.1. IBaseRepository.cs public interface IBaseRepository<T> { T Add(T entity); bool Upd ...

  2. RESTful接口设计原则/最佳实践(学习笔记)

    RESTful接口设计原则/最佳实践(学习笔记) 原文地址:http://www.vinaysahni.com/best-practices-for-a-pragmatic-restful-api 1 ...

  3. Web API接口设计经验总结

    在Web API接口的开发过程中,我们可能会碰到各种各样的问题,我在前面两篇随笔<Web API应用架构在Winform混合框架中的应用(1)>.<Web API应用架构在Winfo ...

  4. Verilog学习笔记简单功能实现(七)...............接口设计(并行输入串行输出)

    利用状态机实现比较复杂的接口设计: 这是一个将并行数据转换为串行输出的变换器,利用双向总线输出.这是由EEPROM读写器的缩减得到的,首先对I2C总线特征介绍: I2C总线(inter integra ...

  5. 优秀的API接口设计原则及方法(转)

    一旦API发生变化,就可能对相关的调用者带来巨大的代价,用户需要排查所有调用的代码,需要调整所有与之相关的部分,这些工作对他们来说都是额外的.如果辛辛苦苦完成这些以后,还发现了相关的bug,那对用户的 ...

  6. atitit.基于http json api 接口设计 最佳实践 总结o7

    atitit.基于http  json  api 接口设计 最佳实践 总结o7 1. 需求:::服务器and android 端接口通讯 2 2. 接口开发的要点 2 2.1. 普通参数 meth,p ...

  7. App接口设计

    关于APP接口设计 http://blog.csdn.net/gebitan505/article/details/37924711/

  8. App接口设计原则-b

    1.记住密码不是真的让你记住密码,这里仅仅指的是一种自动登录的手段.不管在任何地方,明文存储的密码都是安全隐患,是必须尽量避免的.你可以采用某种方式对用户名.密码以及时间戳(重要)进行签名,再次登录时 ...

  9. 蓝牙(BLE)应用框架接口设计和应用开发——以TI CC2541为例

    本文从功能需求的角度分析一般蓝牙BLE单芯片的应用框架(SDK Framework)的接口设计过程,并以TI CC2541为例说明BLE的应用开发方法. 一.应用框架(Framework) 我们熟知的 ...

  10. Spring+SpringMVC+MyBatis+easyUI整合进阶篇(二)RESTful API实战笔记(接口设计及Java后端实现)

    写在前面的话 原计划这部分代码的更新也是上传到ssm-demo仓库中,因为如下原因并没有这么做: 有些使用了该项目的朋友建议重新创建一个仓库,因为原来仓库中的项目太多,结构多少有些乱糟糟的. 而且这次 ...

随机推荐

  1. linux安装redis完整步骤

    linux安装redis完整步骤 安装:1.获取redis资源 wget http://download.redis.io/releases/redis-4.0.8.tar.gz 2.解压 tar x ...

  2. rabbitMq消息没收到排查

    rabbitMq消息没收到排查 首先看是否本地机器开了服务,或者测试环境里面其他的个人电脑本地服务启动注册了,都监听了同一个队列,导致队列消息被接走了.现象是在测试环境期望的执行没有运行.或者关注服务 ...

  3. svn服务端安装和使用

    首先去官网下载安装包 点我下载 下载完了以后选择安装路径然后一直next就可以了 安装完了以后在开始菜单里面找到svn 打开  如何使用? 这里是创建代码管理的存储库 点击 repositories ...

  4. Puremvc

    Puremvc 框架unitypuremvc PureMVC健壮.易扩展.易维护 Many so-called Model-View-Controller frameworks today seem ...

  5. Python优雅遍历字典删除元素的方法

    在Python中,直接遍历字典并在遍历过程中删除元素可能会导致运行时错误,因为字典在迭代时并不支持修改其大小.但是,我们可以通过一些方法间接地达到这个目的. 1.方法一:字典推导式创建新字典(推荐) ...

  6. LLM并行训练4-megascale论文学习

    算法优化 并行注意力机制 \[串行版本: y = x + MLP(LayerNorm(x + Attention(LayerNorm(x)))) \] \[并行版本: y = x + MLP(Laye ...

  7. ChatGPT学习之旅 (8) 单元测试助手

    大家好,我是Edison. 本篇我们基于上一篇的基础,来写一个单元测试助手的prompt,让它帮我们写一些我们.NET开发者不太愿意编写的单元测试代码,进而提高我们的代码质量,同时还降低我们的开发工作 ...

  8. SpringBoot快速插入Mysql 1000万条数据

    导读 有时候为了验证系统瓶颈,需要往数据库表中插入大量数据,可以写sheel脚本插入,前几天为了插入100万条数据,走的sheel脚本(点我直达),插入速度简直无法直视,花了3小时,才插入了10万条, ...

  9. Oracle 启用、禁用触发器

    基本语法 启用指定表中所有触发器(trigger) alter table table_name enable all triggers; 语法: alter table 表名 enable all ...

  10. 基于协同过滤技术的网上书城设计实现(源码+lw+部署文档+讲解等)

    \n文末获取源码联系 感兴趣的可以先收藏起来,大家在毕设选题,项目以及论文编写等相关问题都可以给我加好友咨询 系统介绍: 社会发展日新月异,用计算机应用实现数据管理功能已经算是很完善的了,但是随着移动 ...