参考网址:https://blog.csdn.net/isea533/article/details/80345507

感谢博主的文章,在此申明,代码为本人参考博主对二叉树删除节点的解析所写,实验通过。若有所欠缺,欢迎各位高人指点!!谢谢。

二叉树删除分为三种情况:

1、目标节点没有任何子节点。此时只需接触其与父节点的关系即可。(需要判断目标节点是父节点的左子节点还是右子节点)

  if((NULL == tmp->left) && (NULL == tmp->right))  //目标节点没有任何子节点,直接删除//{if(tmp == prev->left)  //prev为目标节点的父节点地址//prev->left=NULL;else if(tmp == prev->right)prev->right=NULL;free(tmp);return head;}

2、目标节点有一个子节点。让目标节点的父节点与目标节点的子节点建立联系,然后解除目标节点

  if(NULL != tmp->left)    //目标节点只存在左子节点//{if(NULL != prev){if(tmp == prev->left)prev->left = tmp->left;else if(tmp == prev->right)prev->right = tmp->left;free(tmp);return head;}if(NULL == prev)   //目标节点的上一个节点为空,说明该节点为树的根结点,且只有左子节点。//{head=tmp->left;free(tmp);return head;}}if(NULL != tmp->right)   //目标节点只存在右子节点//{if(NULL != prev){if(tmp == prev->left)prev->left = tmp->right;else if(tmp == prev->right)prev->right = tmp->right;free(tmp);return head;}if(NULL == prev){head = tmp->right;free(tmp);return head;}}

3、目标节点存在左右两个子节点。这个需要根据二叉树的中序排序来分析了,(请参考文件提供的参考链接哈);这里需要说明一下,之所以是根据中序遍历来确认替代的节点,与二叉树左小右大的特点有关,需要找一个折中的值来代替目标节点。

  if((NULL != tmp->left) && (NULL != tmp->right))   //目标节点的左右都有子节点,根据中序排序删除//{tree *del_tmp=tmp;  //记录要删除的节点位置//// *del_prev=prev;tmp = tmp->right;if(NULL == tmp->left)  //如果一开始就没有左节点//{del_tmp->input_data=tmp->input_data;if(NULL == tmp->right)del_tmp->right=NULL;elsedel_tmp->right=tmp->right;free(tmp);return head;}while(NULL != tmp->left){prev=tmp;tmp = tmp->left;}if(NULL == tmp->right)prev->left=NULL;if(NULL != tmp->right)prev->left=tmp->right;del_tmp->input_data=tmp->input_data;free(tmp);return head;}

最后,是我的完整代码,可在Linux环境下编译执行。

#include <stdio.h>
#include <stdlib.h>#define LEN 10
typedef struct Del_tree{int input_data;struct Del_tree *left,*right;
}tree;tree *tree_delNode(tree *head,int del_data);   //二叉树删除任意节点//
void test_show(tree *head,int type,  int level);
int main(void)
{tree *new,*tmp=NULL,*head=NULL;int len;srand(getpid());for(len=0;len<LEN;len++){new=malloc(sizeof(tree));new->input_data=rand()%50+5;new->left=NULL;new->right=NULL;if(NULL == head){head = new;continue;}tmp=head;while(1){while((NULL != tmp->left)&&(tmp->input_data >= new->input_data))tmp=tmp->left;while((NULL != tmp->right)&&(tmp->input_data < new->input_data))tmp=tmp->right;if((NULL == tmp->left) && (tmp->input_data >= new->input_data)){tmp->left=new;break;}if((NULL == tmp->right) && (tmp->input_data < new->input_data)){tmp->right=new;break;}}}test_show(head,0,0);printf("\n");/*======================节点查找测试========================*/int find_data;while(1){printf("输入要删除的节点值:");scanf("%d",&find_data);if(0>find_data)break;head=tree_delNode(head,find_data);test_show(head,0,0);printf("\n");}/*==========================================================*/
}/*====================================================================*/
tree *tree_delNode(tree *head,int del_data)
{tree *tmp=head,*prev=NULL;  //记录上一个节点地址//int array_size=0;   //数组元素遍历///*查找要删除的节点位置*/while(1){while((tmp->input_data>del_data) && (NULL != tmp->left)){prev=tmp;tmp=tmp->left;}while((tmp->input_data<del_data) && (NULL != tmp->right)){prev=tmp;tmp=tmp->right;}if((tmp->input_data != del_data) && (NULL == tmp->left) && (NULL == tmp->right)){printf("未找到节点!\n");return head;}if(tmp->input_data == del_data)break;}/*====================*//*分三种情况删除*/if((NULL == tmp->left) && (NULL == tmp->right))  //目标节点没有任何子节点,直接删除//{if(tmp == prev->left)  //prev为目标节点的父节点地址//prev->left=NULL;else if(tmp == prev->right)prev->right=NULL;free(tmp);return head;}if((NULL != tmp->left) && (NULL != tmp->right))   //目标节点的左右都有子节点,根据中序排序删除//{tree *del_tmp=tmp;  //记录要删除的节点位置//// *del_prev=prev;tmp = tmp->right;if(NULL == tmp->left)  //如果一开始就没有左节点//{del_tmp->input_data=tmp->input_data;if(NULL == tmp->right)del_tmp->right=NULL;elsedel_tmp->right=tmp->right;free(tmp);return head;}while(NULL != tmp->left){prev=tmp;tmp = tmp->left;}if(NULL == tmp->right)prev->left=NULL;if(NULL != tmp->right)prev->left=tmp->right;del_tmp->input_data=tmp->input_data;free(tmp);return head;}if(NULL != tmp->left)    //目标节点只存在左子节点//{if(NULL != prev){if(tmp == prev->left)prev->left = tmp->left;else if(tmp == prev->right)prev->right = tmp->left;free(tmp);return head;}if(NULL == prev)   //目标节点的上一个节点为空,说明该节点为树的根结点,且只有左子节点。//{head=tmp->left;free(tmp);return head;}}if(NULL != tmp->right)   //目标节点只存在右子节点//{if(NULL != prev){if(tmp == prev->left)prev->left = tmp->right;else if(tmp == prev->right)prev->right = tmp->right;free(tmp);return head;}if(NULL == prev){head = tmp->right;free(tmp);return head;}}/*==============*/
}
/*=================测试打印===========================*/
void test_show(tree *head,int type,  int level)
{tree *tmp=head;if(NULL == tmp)return;int i;test_show(tmp->right,2,level+1);switch (type){case 0:printf("%d\n",tmp->input_data);break;case 1:for (i = 0; i < (level-1)*2; i++)printf("  ");printf("   \\\n");for (i = 0; i < level*2; i++)printf("  ");printf("%d\n",tmp->input_data);break;case 2:for (i = 0; i < level*2; i++)printf("  ");printf("%d\n",tmp->input_data);for (i = 0; i < (level-1)*2; i++)printf("  ");printf("   /\n");break;}test_show(tmp->left,1,level+1);
}
/*===========================================================*/

附加说明:本人承接Linux系统的嵌入式软件开发项目,CODESYS的runntime组件开发。欢迎加微:wxk101633(备注:委托开发)

C语言实现二叉树的节点删除相关推荐

  1. C语言求二叉树的垂直总和(附完整源码)

    C语言求二叉树的垂直总和 C语言求二叉树的垂直总和完整源码(定义,实现,main函数测试) C语言求二叉树的垂直总和完整源码(定义,实现,main函数测试) #include <iostream ...

  2. C语言判断二叉树是否为二叉搜索树(附完整源码)

    C语言判断二叉树是否为二叉搜索树 C语言判断二叉树是否为二叉搜索树完整源码(定义,实现,main函数测试) C语言判断二叉树是否为二叉搜索树完整源码(定义,实现,main函数测试) #include ...

  3. C语言反转二叉树的递归和迭代解决方案(附完整源码)

    C语言反转二叉树的递归和迭代解决方案 C语言反转二叉树的递归和迭代解决方案完整源码(定义,实现,main函数测试) C语言反转二叉树的递归和迭代解决方案完整源码(定义,实现,main函数测试) #in ...

  4. C语言实现二叉树(附完整源码)

    C语言实现二叉树 C语言实现二叉树完整源码 C语言实现二叉树完整源码 #include <stdio.h> #include <stdlib.h> #define TRUE 1 ...

  5. c语言二叉树的生成,C语言实现二叉树的创建以及遍历(递归)

    C语言实现二叉树的创建以及遍历 #include typedef char ElemType; typedef struct BiTNode { ElemType data; struct BiTNo ...

  6. java二叉树代码_JAVA语言实现二叉树生成的代码教程

    本文主要向大家介绍了JAVA语言实现二叉树生成的代码教程,通过具体的内容向大家展示,希望对大家学习JAVA语言有所帮助. 给定某二叉树三序遍历中的两个,我们即可以通过生成该二叉树,并遍历的方法,求出剩 ...

  7. c语言利用遍历求树高的程序,用C语言实现二叉树的遍历极其应用

    用C语言实现二叉树的遍历极其应用 [1][摘要]:<数据结构>是计算机系学生的一门专业技术基础课程,计算机科学各领域及有关的应用软件都要用到各种数据结构.C语言有较丰富的数据类型.运算符以 ...

  8. C语言二叉树字符统计,C语言实现二叉树-利用二叉树统计单词数目

    昨天刚参加了腾讯2015年在线模拟考: 四道大题的第一题就是单词统计程序的设计思想: 为了记住这一天,我打算今天通过代码实现一下: 我将用到的核心数据结构是二叉树: (要是想了解简单二叉树的实现,可以 ...

  9. C语言实现二叉树的各种遍历及求解深度

                                                                               C语言实现二叉树的各种遍历及求解深度 一.介绍   ...

最新文章

  1. Comet OJ - Contest #2题解
  2. 034:DTL常用过滤器(3)
  3. android 浏览文件夹,如何浏览android中的文件夹并获取所选文件夹的路径
  4. 混合云应用双活容灾实践
  5. 趣学python3(15)-f-string字符串
  6. 【Ajax Servlet JSP MySQL】Ajax实现省份地区选择:三级联动
  7. java用easyexcel实现读取excell表格内容
  8. 为什么下了android 4.1 的SDK后在本地用浏览器看api说明文档时,浏览器打开api的html文件很慢?试了好几款浏览器都一样。为什么?...
  9. Apache Hadoop 启动报错:masternode:ssh: connect to host master port 22: Connection timed out 总结
  10. php mysql 日期查找_PHP / MySQL存储和搜索日期
  11. html手机页面怎么长按不出复制,HTML -----对于手机页面长按会粘贴复制的禁用
  12. 游戏开发电子书(PDF)下载分享
  13. 运放全波整流电路_万能整流电路:运放+整流二极管
  14. PTA(Java类与对象 方法,方法重载) 7-1 设计一个风扇Fan类
  15. Win11保留的存储空间怎么关闭?Win11释放系统保留存储空间教程
  16. mysql免安装版linux_Linux下配置免安装版的MySQL
  17. 70年代的健美比赛——施瓦辛格
  18. 程序化随机多边形地图生成
  19. matlab画光顺曲线,曲线曲面
  20. new ActionListener(){}

热门文章

  1. zbzcms代码审计
  2. 开店做生意全靠套路!学会这四个营销套路,业绩翻数倍!
  3. java接口 泛型_java泛型接口是肿么一回事,干什么用的
  4. 基于Java Applet的大学生综合测评系统设计与实现
  5. 有关初始化的一些问题
  6. 速看|期待已久的2022年广州助理检测工程师真题解析终于出炉
  7. 福建计算机等级考试分值,福建省考行测分值分布
  8. vue-http与https互相转换
  9. python列表习题
  10. HTML之学习的快乐