17.8 为数组形式的树编写模块,用于从树中删除一个值,如果没有找到,程序节点

ArrayBinaryTree.c

//
// Created by mao on 16-9-18.
// #include "ArrayBinaryTree.h"
#include <assert.h>
#include <stdio.h> unsigned long leftChild(unsigned long current)
{
return 2 * current;
} unsigned long rightChild(unsigned long current)
{
return 2 * current + 1;
} void insert(TREE_TYPE value)
{
int current = 1;
while(tree[current] != 0 && current < TREE_SIZE){
if(tree[current] < value){
current = 2 * current + 1;
}else if(tree[current] > value){
current = 2 * current;
}else {
//一插入直接返回
return ;
}
}
assert(current <= TREE_SIZE);
tree[current] = value;
} TREE_TYPE *find(TREE_TYPE value)
{
int current = 1;
while(tree[current] != 0 && current < TREE_SIZE){
if(tree[current] < value){
current = 2 * current + 1;
}else if(tree[current] > value){
current = 2 * current;
}else {
//找到值
break;
}
}
assert(current <= TREE_SIZE);
return (tree + current);
} //先序遍历
void do_pre_order_traverse(unsigned long current)
{
if(tree[current] != 0){
printf("%d ", tree[current]);
do_pre_order_traverse(leftChild(current));
do_pre_order_traverse(rightChild(current));
}
} //寻找current树下面的最大值的树,返回指向该地址的指针
TREE_TYPE *findMax(unsigned long current)
{
assert(tree[current] != 0);
while(tree[current] != 0){
current = rightChild(current);
}
return tree + (current / 2);
}
//寻找最小树
TREE_TYPE *findMin(unsigned long current)
{
assert(tree[current] != 0);
while(tree[current] != 0){
current = leftChild(current);
}
return tree + (current / 2);
} //查找左子树最大节点然后替换,然后删除最大节点
void delete(TREE_TYPE value)
{
TREE_TYPE *ptr = find(value);
TREE_TYPE temp;
//待删除节点的下标
unsigned long current = ptr - tree; if(tree[leftChild(current)] != 0 && tree[rightChild(current)] != 0){
//如果有两个子树,用左子树最大值替换,然后删除最大值树
TREE_TYPE *leftMax = findMax(leftChild(current));
temp = *leftMax;
//删除最大值然后替换
delete(temp);
tree[current] = temp;
}else if(tree[leftChild(current)] == 0 && tree[rightChild(current)] == 0){
//如果没有子树
tree[current] = 0;
}else{
if(tree[leftChild(current)] != 0){
//左子树,最大值树删除,替换
TREE_TYPE *leftMax = findMax(leftChild(current));
//删除最大值然后替换
delete(*leftMax);
tree[current] = *leftMax;
}else{
//只有右子树,右子树最小值替换
TREE_TYPE *rightMin = findMin(rightChild(current));
temp = *rightMin;
delete((temp));
tree[current] = temp;
}
}
}

ArrayBinaryTree.h

//
// Created by mao on 16-9-18.
// #ifndef ARRAYBINARYTREE_H
#define ARRAYBINARYTREE_H
#define TREE_SIZE 100
#define ARRAY_SIZE (TREE_SIZE + 1)
typedef int TREE_TYPE;
static TREE_TYPE tree[ARRAY_SIZE] = {0}; unsigned long leftChild(unsigned long current);
unsigned long rightChild(unsigned long current);
void insert(TREE_TYPE value);
TREE_TYPE *find(TREE_TYPE value);
void delete(TREE_TYPE value);
void do_pre_order_traverse(unsigned long current);
TREE_TYPE *findMax(unsigned long current);
TREE_TYPE *findMin(unsigned long current);
#endif //ARRAYBINARYTREE_H

main.c

#include <stdio.h>
#include "ArrayBinaryTree.h" int main()
{
insert(20);
insert(12);
insert(5);
insert(9);
insert(16);
insert(17);
insert(25);
insert(28);
insert(26);
insert(29);
do_pre_order_traverse(1);
delete(25);
delete(20); printf("\n");
do_pre_order_traverse(1);
return 1;
}

运行:

C和指针 第十七章 习题的更多相关文章

  1. C和指针 第六章 习题

    6.1编写一个函数,它在一个字符串中进行搜索,查找所有在一个给定字符集中出现的字符,返回第一个找到的字符位置指针,未找到返回NULL #include <stdio.h> char * f ...

  2. C和指针 第十七章 二叉树删除节点

    二叉树的节点删除分为三种情况: 1.删除的节点没有子节点,直接删除即可 2. 删除的节点有一个子节点,直接用子节点替换既可以 3.删除的节点有两个子节点. 对于第三种情况,一般是不删除这个节点,而是删 ...

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

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

  4. C和指针 第十三章 习题

    1,1标准输入读入字符,统计各类字符所占百分比 #include <stdio.h> #include <ctype.h> //不可打印字符 int isunprint(int ...

  5. C和指针 第十一章 习题

    1编写calloc,内部使用malloc函数获取内存 #include <stdio.h> #include <stdlib.h> void *myAlloc(unsigned ...

  6. C和指针 第七章 习题

    7.1 hermite递归函数 int hermite(int n, int x) { if (n <= 0) { return 1; } if (n == 1) { return 2 * x; ...

  7. C和指针 第五章 习题

    下列输出的值: #include <stdio.h> int func(){ static int count = 1; return ++count; } int main() { in ...

  8. C和指针 第四章 习题

    4.1正数的n的平方根可以通过: ai+1= (ai + n / ai ) / 2 得到,第一个a1是1,结果会越来越精确. #include <stdio.h> int main() { ...

  9. C和指针 第三章 习题

    在一个源文件中,有两个函数x和y,定义一个链接属性external储存类型static的变量a,且y可以访问,x不可以访问,该如何定义呢? #include <stdio.h> void ...

随机推荐

  1. 方法传参(JAVA与C的比较)

    java代码:public class Test{ static int e; // 默认是0 static String f; //默认是null public static void main(S ...

  2. 新手!mass 设置问题

    mass就是你那个物体的质量啊质量越大,惯性也越大重力也越大.假如你的刚体的mass为1,那么你只要给这个物体9.81N向上的力,你就可以抵消重力,让这个物体悬浮着:但假如这个物体的mass为10,你 ...

  3. 好用的dos命令

    控制台使用"help"查看帮助,使用"help + command-name"或"command-name /?"查看命令帮助. dir 可 ...

  4. JS中字符串的true转化为boolean类型的true

    var a="True"; a = eval(a.toLowerCase()); alert(typeof a); //boolean alert(a);//true 正解,eva ...

  5. docker学习(5) 在mac中创建mysql docker容器

    github上有一个专门的docker-libary项目,里面有各种各样常用的docker镜像,可以做为学习的示例,今天研究下其中mysql镜像的用法,国内镜像daocloud.io也能找到mysql ...

  6. [LeetCode] Pacific Atlantic Water Flow 太平洋大西洋水流

    Given an m x n matrix of non-negative integers representing the height of each unit cell in a contin ...

  7. [LeetCode] Maximum Product Subarray 求最大子数组乘积

    Find the contiguous subarray within an array (containing at least one number) which has the largest ...

  8. 一个简单oop的changeTab

    好多地方都会用到这样一个效果“点击tab切换内容页”,根据自己的想法实现了一下,写了个简单的插件.以前写代码都是标准的函数式编程,现在觉得面向对象编程看起来比较爽,并且更容易维护,于是就用oop的思想 ...

  9. CSS Hack技术介绍及常用的Hack技巧集锦

    一.什么是CSS Hack? 不同的浏览器对CSS的解析结果是不同的,因此会导致相同的CSS输出的页面效果不同,这就需要CSS Hack来解决浏览器局部的兼容性问题.而这个针对不同的浏览器写不同的CS ...

  10. Less的使用

    Less为css预处理器 首先先去下载一个koala编译器软件,然后运行打开 新建一个项目目录,在css文件夹中新建一个后缀为less的文件,然后拉入koala软件中,然后运行 ,你的css文件夹中就 ...