C和指针 第十七章 二叉树删除节点
二叉树的节点删除分为三种情况:
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.
C和指针 第十七章 二叉树删除节点的更多相关文章
- C和指针 第十七章 习题
17.8 为数组形式的树编写模块,用于从树中删除一个值,如果没有找到,程序节点 ArrayBinaryTree.c // // Created by mao on 16-9-18. // #inclu ...
- C和指针 第十七章 经典数据类型 堆栈 队列 二叉树
堆栈: // // Created by mao on 16-9-16. // #ifndef UNTITLED_STACK_H #define UNTITLED_STACK_H #define TR ...
- Linux内核设计第十七章笔记
第十七章 设备与模块 关于设备驱动和设备管理,四种内核成分 设备类型:在所有unix系统中为了统一普通设备的操作所采用的分类 模块:Linux内核中用于按需加载和卸载目标代码的机制 内核对象:内核数据 ...
- 【C++】《C++ Primer 》第十七章
第十七章 标准库特殊设施 一.tuple类型 tuple是类似pair的模板,每个pair的成员类型都不相同,但每个pair都恰好有两个成员. 不同的tuple类型的成员类型也不相同,一个tuple可 ...
- 程序员编程艺术第三十六~三十七章、搜索智能提示suggestion,附近点搜索
第三十六~三十七章.搜索智能提示suggestion,附近地点搜索 作者:July.致谢:caopengcs.胡果果.时间:二零一三年九月七日. 题记 写博的近三年,整理了太多太多的笔试面试题,如微软 ...
- CSS3秘笈复习:十三章&十四章&十五章&十六章&十七章
第十三章 1.在使用浮动时,源代码的顺序非常重要.浮动元素的HTML必须处在要包围它的元素的HTML之前. 2.清楚浮动: (1).在外围div的底部添加一个清除元素:clear属性可以防止元素包围浮 ...
- c++(排序二叉树删除)
相比较节点的添加,平衡二叉树的删除要复杂一些.因为在删除的过程中,你要考虑到不同的情况,针对每一种不同的情况,你要有针对性的反应和调整.所以在代码编写的过程中,我们可以一边写代码,一边写测试用例.编写 ...
- 2017.2.16 开涛shiro教程-第十七章-OAuth2集成(一)服务器端
原博客地址:http://jinnianshilongnian.iteye.com/blog/2018398 根据下载的pdf学习. 开涛shiro教程-第十七章-OAuth2集成 1.OAuth2介 ...
- 20190903 On Java8 第十七章 文件
第十七章 文件 在Java7中对 文件的操作 引入了巨大的改进.这些新元素被放在 java.nio.file 包下面,过去人们通常把nio中的n理解为new即新的io,现在更应该当成是non-bloc ...
随机推荐
- Centos 7 minimal install 无网络无ifconfig的解决
Centos7这个比较不厚道, minimal install下居然不带net-tools 先要连上网络 修改/etc/sysconfig/network-scripts/ifcfg-ens12312 ...
- [LeetCode] Shortest Word Distance 最短单词距离
Given a list of words and two words word1 and word2, return the shortest distance between these two ...
- 常用jdbc的url
Microsoft SQL Server Microsoft SQL Server JDBC Driver (一般用来连接 SQLServer 2000) 驱动程序包名:msbase.jar mssq ...
- 【MySQL】函数IFNULL、设置默认时间
MySql 函数 IFNUll用法说明 IFNULL(expr1,expr2) 如果 expr1 不是 NULL,IFNULL() 返回 expr1,否则它返回 expr2. IFNULL()返回一个 ...
- 【Kindle】pdf转mobi适合kindle查看格式
pdf转mobi适合kindle查看格式 1.用到软件:福昕风腾PDF套件,切白边,PDF-Viewer,导出png图片ChainLP,图片转换为mobi文件<期间要下载kindlegen.ex ...
- jqGrid jqGrid分页参数+条件查询
HTML <div class="row"> <div class="col-sm-20"> <form id="for ...
- weui 多网页切换效果分析
weui的文档写的不怎么详尽,简单的来讲WeUI 为微信 Web 服务量身设计的h5框架. WeUI是一套同微信原生视觉体验一致的基础样式库,由微信官方设计团队为微信 Web 开发量身设计,可以令用户 ...
- windows中LNK文件打开方式恢复(每日一修(1))
相信有些用户曾试过错误地把LNK文件的打开方式更改其他文件,导致系统所有的快捷方式都失效.在vista与Windows7系统还不普遍使用的时候,相信大家会有点惊慌失措,不要紧,下面只要大家进行如下操作 ...
- 文本文件关键字替换(Java)
代码实现如下: import java.io.File; import java.io.PrintWriter; import java.util.Scanner; public class File ...
- css-css权威指南学习笔记6
第八章 padding/border/margin 1.对于只包含文本的行,能改变行间距里的属性只有line-height/font-size/vertical-align. 2.对行内非替换元素应用 ...