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

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和指针 第十七章 二叉树删除节点的更多相关文章

  1. C和指针 第十七章 习题

    17.8 为数组形式的树编写模块,用于从树中删除一个值,如果没有找到,程序节点 ArrayBinaryTree.c // // Created by mao on 16-9-18. // #inclu ...

  2. C和指针 第十七章 经典数据类型 堆栈 队列 二叉树

    堆栈: // // Created by mao on 16-9-16. // #ifndef UNTITLED_STACK_H #define UNTITLED_STACK_H #define TR ...

  3. Linux内核设计第十七章笔记

    第十七章 设备与模块 关于设备驱动和设备管理,四种内核成分 设备类型:在所有unix系统中为了统一普通设备的操作所采用的分类 模块:Linux内核中用于按需加载和卸载目标代码的机制 内核对象:内核数据 ...

  4. 【C++】《C++ Primer 》第十七章

    第十七章 标准库特殊设施 一.tuple类型 tuple是类似pair的模板,每个pair的成员类型都不相同,但每个pair都恰好有两个成员. 不同的tuple类型的成员类型也不相同,一个tuple可 ...

  5. 程序员编程艺术第三十六~三十七章、搜索智能提示suggestion,附近点搜索

    第三十六~三十七章.搜索智能提示suggestion,附近地点搜索 作者:July.致谢:caopengcs.胡果果.时间:二零一三年九月七日. 题记 写博的近三年,整理了太多太多的笔试面试题,如微软 ...

  6. CSS3秘笈复习:十三章&十四章&十五章&十六章&十七章

    第十三章 1.在使用浮动时,源代码的顺序非常重要.浮动元素的HTML必须处在要包围它的元素的HTML之前. 2.清楚浮动: (1).在外围div的底部添加一个清除元素:clear属性可以防止元素包围浮 ...

  7. c++(排序二叉树删除)

    相比较节点的添加,平衡二叉树的删除要复杂一些.因为在删除的过程中,你要考虑到不同的情况,针对每一种不同的情况,你要有针对性的反应和调整.所以在代码编写的过程中,我们可以一边写代码,一边写测试用例.编写 ...

  8. 2017.2.16 开涛shiro教程-第十七章-OAuth2集成(一)服务器端

    原博客地址:http://jinnianshilongnian.iteye.com/blog/2018398 根据下载的pdf学习. 开涛shiro教程-第十七章-OAuth2集成 1.OAuth2介 ...

  9. 20190903 On Java8 第十七章 文件

    第十七章 文件 在Java7中对 文件的操作 引入了巨大的改进.这些新元素被放在 java.nio.file 包下面,过去人们通常把nio中的n理解为new即新的io,现在更应该当成是non-bloc ...

随机推荐

  1. java实现单链表的整表创建

    package com.java.dataStruct; public class Node<E> { E item; Node next; public Node(){ } public ...

  2. Introduction to graph theory 图论/脑网络基础

    Source: Connected Brain Figure above: Bullmore E, Sporns O. Complex brain networks: graph theoretica ...

  3. [LeetCode] Range Sum Query - Immutable 区域和检索 - 不可变

    Given an integer array nums, find the sum of the elements between indices i and j (i ≤ j), inclusive ...

  4. http 413 wcf

    在网上搜到413的解决办法有多种,看具体项目找到对应的解决办法 如果是wcf返回的413,与serverRuntime无关,只要在Binding中设置最大接收值即可, <binding name ...

  5. C++知识回顾(二)——名称空间

    随着工程的增大,名称相互冲突的肯能性增加,使用多个厂商的类库时,可能导致名称冲突.为了解决这些问题,需要用到名称空间. 为了将代码加入名称空间,可以使用namespae将其包含,例如,编写一段代码,其 ...

  6. css学习笔记(2)

    ----------------|-------------------------|------------------ 标签名           英文全拼                  中文 ...

  7. 在Arcscene绘制管线三维横断面(AE绘制三维点阵文字)

    根据数据信息动态生成三维管线及横断面表格.效果图如下: 在获取信息后,直接构造点阵进行文字绘制即可. 绘制IElement代码: /// <summary> /// 绘制三维文字 /// ...

  8. Android必学——AsyncTask

    第一章  AsyncTask的基本构成 为是么要异步任务 1)Android单线程模型 2)耗时操作放在非主线程中执行 AsyncTask为何而生 1)子线程中跟新UI 2)封装.简化异步操作 pub ...

  9. Codeforces 刷水记录

    Codeforces-566F 题目大意:给出一个有序数列a,这个数列中每两个数,如果满足一个数能整除另一个数,则这两个数中间是有一条边的,现在有这样的图,求最大联通子图. 题解:并不需要把图搞出来, ...

  10. Python 【第五章】:线程、进程和协程

    Python线程 Threading用于提供线程相关的操作,线程是应用程序中工作的最小单元. #!/usr/bin/env python # -*- coding:utf-8 -*- import t ...