C和指针 第十七章 二叉树删除节点
2024-09-29 13:20:31
二叉树的节点删除分为三种情况:
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.
最新文章
- PostgreSQL中标准的SQL boolean数据类型
- [知识整理]Java集合(一) - List
- IOS 手势-轻点、触摸、手势、事件
- HDOJ 1709 The Balance(母函数)
- [改善Java代码]列表相等只需关系元素数据
- 【SQLite】使用事务处理带参数的插入
- LoadRunner 你不知道的事之——内存使用
- 17_AOP入门准备_Salay案例(利用动态代理)
- 【服务器运维】Windows Server 2008 R2 下配置证书服务器和HTTPS
- winform —— 连接数据库SQL Server 2008
- python 使用 tweepy 案例: PS4
- OptiScroll 公共例子(只修改了滚动条颜色)
- 复习知识点:XML解析数据,JOSN解析数据,GET请求数据,POST请求数据
- Struts2 struts.xml配置
- 和团队齐头并进——敏捷软件开发的Scrum的学习
- 设置PATH和CLASSPATH
- nginx笔记6-总结
- Pandas 数据清洗常用篇
- 分享PowerDesigner使用的设置
- Postman 使用方法详解
热门文章
- BZOJ 2434: [Noi2011]阿狸的打字机 [AC自动机 Fail树 树状数组 DFS序]
- MYSQL基础操作
- [No00008C]图解SQL的各种连接join让你对SQL的连接一目了然
- 理解 JavaScript 回调函数并使用
- iOS学习-创建带下划线的button
- iOS开发小技巧 -- tableView-section圆角边框解决方案
- 修改/etc/profile和/etc/environment导致图形界面无法登陆的问题
- 使用Xunit进行单元测试
- CodeForces - 261B Maxim and Restaurant
- 后进先出 stack、 先进先出Queue