c语言怎么添加搜索功能,C语言实现二叉搜索树的创建、插入、删除和查找
代码如下。具体处理见注释。个人原创,非官方。
转载请注明出处。如果发现错误,欢迎大家给我留言。
#include
#include
#include
#define TREE_TYPE int
#define size 15
/**定义树形结构*/
typedef struct Tree
{
TREE_TYPE value;
struct Tree *left;
struct Tree *right;
}Tree_node;
/**根节点作为全局静态变量*/
static Tree_node *root;
/**初始化树*/
void create_tree()
{
root = NULL;
}
/**向树种插入数据*/
Tree_node* insert(Tree_node *node,TREE_TYPE value)
{
if(node == NULL)
{
node = (Tree_node*)malloc(sizeof(Tree_node) * 1);
node-> value = value;
node -> left = NULL;
node -> right = NULL;
if(root == NULL) //如果为根节点
root = node;
}
else
{
if(value < node->value) //比该节点值小,写向左子树
node->left = insert(node->left,value);
else //比该节点值大,写向右子树
node->right = insert(node->right,value);
}
return node;
}
/**显示树中所有节点内容*/
void show_all(Tree_node *node)
{
if(node != NULL)
{
if(node->left != NULL)
show_all(node->left);
printf("%d ",node->value);
if(node->right != NULL);
show_all(node->right);
}
}
/**根据值查找某一特定节点*/
Tree_node* search(Tree_node *node,TREE_TYPE value)
{
Tree_node *result = NULL;
if(node != NULL)
{
if(value == node->value)
result = node;
else if(value < node->value)
result = search(node->left,value);
else
result = search(node->right,value);
}
return result;
}
/**找到某一值对应节点的父节点*/
Tree_node* find_parent(Tree_node *parent,TREE_TYPE value)
{
Tree_node *result = NULL;
if(parent != NULL)
{
if(value < parent->value && parent->left != NULL) //比父节点值小,访问左子树
{
if(value == parent->left->value)
result = parent;
else
{
result = find_parent(parent->left,value);
if(result == NULL)
result = find_parent(parent->right,value);
}
}
if(value > parent->value && parent->right != NULL) //比父节点值大,访问右子树
{
if(value == parent->right->value)
result = parent;
else
{
result = find_parent(parent->left,value);
if(result == NULL)
result = find_parent(parent->right,value);
}
}
}
return result;
}
void delete(TREE_TYPE value)
{
Tree_node *parent = find_parent(root,value); //找到待删节点的父节点
Tree_node *node = search(root,value); //找到待删节点
if(node == NULL) //待删节点不存在
printf("没有待删节点\n");
else //待删节点存在
{
if(node->left == NULL && node->right == NULL) //如果待删节点是叶子节点
{
// assert(parent != NULL);
if(parent == NULL) //如果是根节点
root = NULL;
else //其他节点
{
if(node == parent->left)
parent->left = NULL;
else
parent->right = NULL;
}
}
else if(node->right == NULL) //如果待删节点只有左子树节点
{
if(parent == NULL) //如果是根节点
root = node->left;
else //其他节点
{
if(node == parent->left)
parent->left = node->left;
else
parent->right = node->left;
}
}
else if(node->left == NULL) //如果待删节点只有右子树节点
{
if(parent == NULL) //如果是根节点
root = node->right;
else //其他节点
{
if(node == parent->left)
parent->left = node->right;
else
parent->right = node->right;
}
}
else //如果带删节点左右子树节点都存在
{
Tree_node *new_node = node->right; //需要找到右子树的最左那个
Tree_node *new_node_parent = NULL;
while(new_node->left != NULL)
{
new_node_parent = new_node;
new_node = new_node->left;
}
if(new_node != node->left)
new_node->left = node->left;
if(new_node != node->right)
new_node->right = node->right;
if(parent == NULL)
root = new_node;
else
{
if(node == parent->left) //如果带删节点是父节点的左节点
parent->left = new_node;
else //如果待删节点是父节点的右节点
parent->right = new_node;
}
if(new_node_parent != NULL)//将原来的右子树最左节点删掉
new_node_parent->left = NULL;
}
}
}
int main()
{
/**初始化*/
create_tree();
/**插入*/
TREE_TYPE list[size] = {8,4,11,2,6,10,13,1,3,5,7,9,15,14,16};
int i;
for(i = 0; i < size; i++)
insert(root,list[i]);
/**显示全部*/
show_all(root);
putchar('\n');
/**根据值查找某节点*/
Tree_node *result = search(root,14);
if(result != NULL)
printf("To find %d,result is %d\n",14,result->value);
else
printf("Not find\n");
/**根据值查找其父节点*/
Tree_node *parent_result = find_parent(root,14);
if(parent_result != NULL)
printf("To find %d's parent,result is %d\n",14,parent_result->value);
else
printf("Cannot find %d's parent\n",14);
/**删除*/
delete(14); //删除叶子节点
show_all(root);
putchar('\n');
delete(13); //删除只有右子树的节点
show_all(root);
putchar('\n');
delete(11); //删除只有左子树的节点
show_all(root);
putchar('\n');
delete(4); //删除左右子树都有的节点
show_all(root);
putchar('\n');
return 0;
}
c语言怎么添加搜索功能,C语言实现二叉搜索树的创建、插入、删除和查找相关推荐
- 广度优先搜索生成树怎么画_LeetCode0938: 二叉搜索树的范围和
题目介绍 描述: 给定二叉搜索树的根结点 root,返回 L 和 R(含)之间的所有结点的值的和. 二叉搜索树保证具有唯一的值. 示例 1:输入:root = [10,5,15,3,7,null,18 ...
- 70. Leetcode 701. 二叉搜索树中的插入操作 (二叉搜索树-基本操作类)
给定二叉搜索树(BST)的根节点 root 和要插入树中的值 value ,将值插入二叉搜索树. 返回插入后二叉搜索树的根节点. 输入数据 保证 ,新值和原始二叉搜索树中的任意节点值都不同.注意,可能 ...
- C语言Catalan number卡特兰数(使用n个键可以搜索多少个二叉搜索树)的算法(附完整源码)
C语言使用n个键可以搜索多少个二叉搜索树的算法 C语言使用n个键可以搜索多少个二叉搜索树的算法完整源码(定义,实现,main函数测试) C语言使用n个键可以搜索多少个二叉搜索树的算法完整源码(定义,实 ...
- android开发访问百度搜索,Android开发如何添加搜索功能———大神求救啊
该楼层疑似违规已被系统折叠 隐藏此楼查看此楼 网上的添加搜索功能没有给全代码,反正这些代码在我的程序里就出错 下面上代码- - searchable.xml 放在res/xml里的 android=& ...
- 迷你播放器--第一阶段(5)--添加搜索功能--autoCompleteBox的使用
迷你播放器--第一阶段(5) 添加搜索功能--autoCompleteBox的使用; 本文章为CSDN作者原创,转载请保留出处:http://blog.csdn.net/lrs0304/article ...
- HEXO博客系统添加搜索功能
Hexo 可以通过接入第三方搜索引擎来为博客添加搜索功能.这里给出一种基于 Algolia 搜索引擎的实现方式. 流程 Algolia 是一家搜索解决方案提供商,提供强大的搜索服务和 API 接口.在 ...
- 微信小程序添加搜索功能
小程序添加搜索功能
- 有序二叉树c语言,二叉搜索树(BST)的实现(C语言)(原创)
叉搜索树(Binary Search Tree)的一般形式如下图所示,每个节点中的元素大于它的左子树中的所有元素,小于它的右子树中的所有元素.对该图中的二叉树进行中序遍历得到一个从小到大排列的有序序列 ...
- 利用C语言实现二叉搜索树的遍历、查找、插入、删除
IDE:codebloks,编译器:gcc5.1.0 二叉搜索树和我们通常的二叉树还是有一定的区别,顾名思义,一颗二叉搜索树以一颗二叉树来组织,其中每一个结点就是一个对象.除了key(关键字)和卫星数 ...
- leetcode 98. 验证二叉搜索树 递归遍历左右子树和中序遍历 c语言解法
如题: 给定一个二叉树,判断其是否是一个有效的二叉搜索树. 假设一个二叉搜索树具有如下特征: 节点的左子树只包含小于当前节点的数. 节点的右子树只包含大于当前节点的数. 所有左子树和右子树自身必须也是 ...
最新文章
- 关于Transformer,那些的你不知道的事
- bat脚本交互输入_基于winserver操作系统的自动清理Oracle3天前归档日志脚本分享...
- C语言程序设计之编程求鸡和兔的只数,用穷举法解决
- [转]ORACLE 异常错误处理
- mmu计算机组成原理,计算机组成原理
- 继承的作用是什么?看看下面这些例子吧!
- 读取Excel文件的版本
- C语言程序设计 第八章字符串
- 利用docker容器ubuntu安装truecrypt
- Diffusion Models:生成扩散模型
- 莫烦python学习笔记
- 001-markdown简介,插件的下载和导出
- matlab快速解方程,matlab如何解方程 matlab解方程 matlab如何解方程
- 阿卡迪亚大学计算机科学专业,阿卡迪亚大学世界排名解读
- 妻子和鱼----海子
- 如何与VMware虚拟机共享文件
- 发现了一个好用的WEB项目打印控件--四方打印
- 静态/动态博客Blog框架简介
- macOS打开Excel镜像翻转问题
- 如何解除WORD限制编辑
热门文章
- UIActivityIndicatorView活动指示器(菊花)
- php中对文件的读取和写入
- 中建股份400亿大型IPO获“特批”
- 基于迭代局部搜索和随机惯性权重的BA算法MATLAB实现(ILSSIWBA)
- model.evaluate 输出出一大串 ======================
- 《剑指offer》面试题42——翻转单词顺序列
- Machine Learning——Homework 7
- keras中无法用save保存模型的问题
- Echarts常用配置参数
- pyecharts制作交互式数据展示地图