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

1.删除的节点没有子节点,直接删除即可

2. 删除的节点有一个子节点,直接用子节点替换既可以

3.删除的节点有两个子节点。

对于第三种情况,一般是不删除这个节点,而是删除左子树中最大的值的节点,并用这个值替换原先应该被删除的节点。左子树的最大节点只可能有一个或者没有子节点,所以删除很方便。

//删除节点,返回指向修改过的节点的指针
TREE_NODE* deleteNode(TREE_TYPE value, TREE_NODE *tree)
{
TREE_NODE *tempTree;
if(tree == NULL){
//未找到节点
printf("no found value in tree\n");
return NULL;
}else if(tree -> value > value){
//如果要找的值在左子树中,到左子树中删除,删除节点后,返回节点指针给父节点,然后父节点修正自己的leftPtr或者rightPtr
tree -> leftPtr = deleteNode(value, tree -> leftPtr);
}else if(tree -> value < value){
//如果在右子树中
tree -> rightPtr = deleteNode(value, tree -> rightPtr);
}else if(tree -> leftPtr && tree -> rightPtr){
//找到该节点,且有双子树,先找最大左子树节点
tempTree = findMaxNode(tree -> leftPtr);
//替换值即可
tree -> value = tempTree -> value;
//然后删除该最大左子树节点,最大左子树只会有一个或者没有子节点,否则不会是最大子节点
deleteNode(tree -> value, tempTree);
}else{
//如果没有子节点,或者有一个子节点,直接用子节点替换,然后删除
//先保存最大右子树,然后将最大右子树用它的子节点替换,然后删除最大右子树
tempTree = tree;
if(tree -> leftPtr == NULL){
tree = tree -> rightPtr;
}else if(tree -> rightPtr == NULL){
tree = tree -> leftPtr;
}
free(tempTree);
} return tree;
}

测试代码:

#include <stdio.h>
#include "BinaryTree.h" int main()
{
createTree(20);
insertNode(12);
insertNode(5);
insertNode(9);
insertNode(16);
insertNode(17);
insertNode(25);
insertNode(28);
insertNode(26);
insertNode(29); TREE_NODE *ptr;
//删除节点5的父节点值12
deleteNode(12, root);
//再次查看5的父节点
ptr = findParent(5); //如果为根节点,没有父节点
if(ptr == NULL){
printf("it's root");
}else{
printf("%d\n", ptr -> value);
} return 1;
}

运行:

12原本是5的父节点,删除后,从12的左子树中用最大左子树值9替换12,然后删除9,此时5的父节点变为9.

最新文章

  1. PostgreSQL中标准的SQL boolean数据类型
  2. [知识整理]Java集合(一) - List
  3. IOS 手势-轻点、触摸、手势、事件
  4. HDOJ 1709 The Balance(母函数)
  5. [改善Java代码]列表相等只需关系元素数据
  6. 【SQLite】使用事务处理带参数的插入
  7. LoadRunner 你不知道的事之——内存使用
  8. 17_AOP入门准备_Salay案例(利用动态代理)
  9. 【服务器运维】Windows Server 2008 R2 下配置证书服务器和HTTPS
  10. winform —— 连接数据库SQL Server 2008
  11. python 使用 tweepy 案例: PS4
  12. OptiScroll 公共例子(只修改了滚动条颜色)
  13. 复习知识点:XML解析数据,JOSN解析数据,GET请求数据,POST请求数据
  14. Struts2 struts.xml配置
  15. 和团队齐头并进——敏捷软件开发的Scrum的学习
  16. 设置PATH和CLASSPATH
  17. nginx笔记6-总结
  18. Pandas 数据清洗常用篇
  19. 分享PowerDesigner使用的设置
  20. Postman 使用方法详解

热门文章

  1. BZOJ 2434: [Noi2011]阿狸的打字机 [AC自动机 Fail树 树状数组 DFS序]
  2. MYSQL基础操作
  3. [No00008C]图解SQL的各种连接join让你对SQL的连接一目了然
  4. 理解 JavaScript 回调函数并使用
  5. iOS学习-创建带下划线的button
  6. iOS开发小技巧 -- tableView-section圆角边框解决方案
  7. 修改/etc/profile和/etc/environment导致图形界面无法登陆的问题
  8. 使用Xunit进行单元测试
  9. CodeForces - 261B Maxim and Restaurant
  10. 后进先出 stack、 先进先出Queue