代码如下。具体处理见注释。个人原创,非官方。

转载请注明出处。如果发现错误,欢迎大家给我留言。

#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语言实现二叉搜索树的创建、插入、删除和查找相关推荐

  1. 广度优先搜索生成树怎么画_LeetCode0938: 二叉搜索树的范围和

    题目介绍 描述: 给定二叉搜索树的根结点 root,返回 L 和 R(含)之间的所有结点的值的和. 二叉搜索树保证具有唯一的值. 示例 1:输入:root = [10,5,15,3,7,null,18 ...

  2. 70. Leetcode 701. 二叉搜索树中的插入操作 (二叉搜索树-基本操作类)

    给定二叉搜索树(BST)的根节点 root 和要插入树中的值 value ,将值插入二叉搜索树. 返回插入后二叉搜索树的根节点. 输入数据 保证 ,新值和原始二叉搜索树中的任意节点值都不同.注意,可能 ...

  3. C语言Catalan number卡特兰数(使用n个键可以搜索多少个二叉搜索树)的算法(附完整源码)

    C语言使用n个键可以搜索多少个二叉搜索树的算法 C语言使用n个键可以搜索多少个二叉搜索树的算法完整源码(定义,实现,main函数测试) C语言使用n个键可以搜索多少个二叉搜索树的算法完整源码(定义,实 ...

  4. android开发访问百度搜索,Android开发如何添加搜索功能———大神求救啊

    该楼层疑似违规已被系统折叠 隐藏此楼查看此楼 网上的添加搜索功能没有给全代码,反正这些代码在我的程序里就出错 下面上代码- - searchable.xml 放在res/xml里的 android=& ...

  5. 迷你播放器--第一阶段(5)--添加搜索功能--autoCompleteBox的使用

    迷你播放器--第一阶段(5) 添加搜索功能--autoCompleteBox的使用; 本文章为CSDN作者原创,转载请保留出处:http://blog.csdn.net/lrs0304/article ...

  6. HEXO博客系统添加搜索功能

    Hexo 可以通过接入第三方搜索引擎来为博客添加搜索功能.这里给出一种基于 Algolia 搜索引擎的实现方式. 流程 Algolia 是一家搜索解决方案提供商,提供强大的搜索服务和 API 接口.在 ...

  7. 微信小程序添加搜索功能

    小程序添加搜索功能

  8. 有序二叉树c语言,二叉搜索树(BST)的实现(C语言)(原创)

    叉搜索树(Binary Search Tree)的一般形式如下图所示,每个节点中的元素大于它的左子树中的所有元素,小于它的右子树中的所有元素.对该图中的二叉树进行中序遍历得到一个从小到大排列的有序序列 ...

  9. 利用C语言实现二叉搜索树的遍历、查找、插入、删除

    IDE:codebloks,编译器:gcc5.1.0 二叉搜索树和我们通常的二叉树还是有一定的区别,顾名思义,一颗二叉搜索树以一颗二叉树来组织,其中每一个结点就是一个对象.除了key(关键字)和卫星数 ...

  10. leetcode 98. 验证二叉搜索树 递归遍历左右子树和中序遍历 c语言解法

    如题: 给定一个二叉树,判断其是否是一个有效的二叉搜索树. 假设一个二叉搜索树具有如下特征: 节点的左子树只包含小于当前节点的数. 节点的右子树只包含大于当前节点的数. 所有左子树和右子树自身必须也是 ...

最新文章

  1. 关于Transformer,那些的你不知道的事
  2. bat脚本交互输入_基于winserver操作系统的自动清理Oracle3天前归档日志脚本分享...
  3. C语言程序设计之编程求鸡和兔的只数,用穷举法解决
  4. [转]ORACLE 异常错误处理
  5. mmu计算机组成原理,计算机组成原理
  6. 继承的作用是什么?看看下面这些例子吧!
  7. 读取Excel文件的版本
  8. C语言程序设计 第八章字符串
  9. 利用docker容器ubuntu安装truecrypt
  10. Diffusion Models:生成扩散模型
  11. 莫烦python学习笔记
  12. 001-markdown简介,插件的下载和导出
  13. matlab快速解方程,matlab如何解方程 matlab解方程 matlab如何解方程
  14. 阿卡迪亚大学计算机科学专业,阿卡迪亚大学世界排名解读
  15. 妻子和鱼----海子
  16. 如何与VMware虚拟机共享文件
  17. 发现了一个好用的WEB项目打印控件--四方打印
  18. 静态/动态博客Blog框架简介
  19. macOS打开Excel镜像翻转问题
  20. 如何解除WORD限制编辑

热门文章

  1. UIActivityIndicatorView活动指示器(菊花)
  2. php中对文件的读取和写入
  3. 中建股份400亿大型IPO获“特批”
  4. 基于迭代局部搜索和随机惯性权重的BA算法MATLAB实现(ILSSIWBA)
  5. model.evaluate 输出出一大串 ======================
  6. 《剑指offer》面试题42——翻转单词顺序列
  7. Machine Learning——Homework 7
  8. keras中无法用save保存模型的问题
  9. Echarts常用配置参数
  10. pyecharts制作交互式数据展示地图