/********************************************************************************************************
*
*
* 设计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. mysql分组求最大ID记录行方法

    ##创建表 CREATE TABLE `test_user` ( `id` INT(11) NOT NULL AUTO_INCREMENT, `order_no` BIGINT(20) DEFAULT ...

  2. java和javac编译和运行记事本编写的代码

    演示代码如下: package com.springboot.demo; public class Hello { public static void main(String[] args) { S ...

  3. 随机二次元图片API上线

    Tips:当你看到这个提示的时候,说明当前的文章是由原emlog博客系统搬迁至此的,文章发布时间已过于久远,编排和内容不一定完整,还请谅解` 随机二次元图片API上线 日期:2017-12-6 阿珏 ...

  4. 支付宝 返回的form如何在前端打开

    支付宝支付时返回了一段标签标签大概是 <form></form><script></script> 试了innerHtml怎么试都不能用,是那种直接把字 ...

  5. 前端学习之nvm

    接手了新的项目 需要使用nodejs,但是版本又不同如何解决呢 如果自己下载配置环境变量也太复杂了 下载nvm https://nvm.uihtm.com/download.html 使用nvm 下载 ...

  6. hbck2的一些用法

    一.执行 hbase org.apache.hbase.HBCK2 可以看到下面一些选择项 **示例: -d 打印debug日志 -s 跳过客户端与服务端一致性的版本检测 hbase org.apac ...

  7. 数据库学习(一)——DDL数据库定义语句

    定义数据库 创建数据库 使用CRETE DATABASE关键字,指定编码和排序格式 CREATE DATABASE mysqldb DEFAULT CHARACTER SET utf-8 DEFAUL ...

  8. pycharm中运行jupyter notebook

    进入anaconda prompt,进入对应的虚拟环境 输入jupyter notebook,找到路径和token 这两个随便复制一个,注意是包括token也要复制到 然后打开pycharm,并建立一 ...

  9. Prometheus监控系统(三)Prometheus与Grafana集成

    1. Prometheus和Grafana集成 Grafana是一款采用Go语言编写的开源应用,主要用于大规模指标数据的可视化展现,是网络架构和应用分析中最流行的时序数据展示工具.目前已支持绝大部分常 ...

  10. 深度解读昇腾CANN多流并行技术,提高硬件资源利用率

    本文分享自华为云社区<深度解读昇腾CANN多流并行技术,提高硬件资源利用率>,作者:昇腾CANN. 随着人工智能应用日益成熟,文本.图片.音频.视频等非结构化数据的处理需求呈指数级增长,数 ...