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解约瑟夫环问题的循环链表,唏嘘不已,想想自己一年前嵌入式的梦呢,这两天发生了许多,而有些人不在了就真的不在了,心情不好,不多说了,直接上代码,只是些链表的基本操 ...

  2. [LeetCode] Reverse Linked List II 倒置链表之二

    Reverse a linked list from position m to n. Do it in-place and in one-pass. For example:Given 1-> ...

  3. [个人翻译]Redis 集群教程(中)

    上一篇:http://www.cnblogs.com/li-peng/p/6143709.html 官方原文地址:https://redis.io/topics/cluster-tutorial  水 ...

  4. Java连接远程Redis

    redis-server &  //后台启动redis redis-cli //使用redis   打开redis.conf文件在NETWORK部分有说明   /usr/local/src   ...

  5. ActiveMQ安全配置

    1.activeMQ管理后台用户名.密码的设置 管理后台地址http://localhost:8161/admin 默认用户名密码admin admin 端口默认是8161,且服务采用的是服务器,所以 ...

  6. 看完这篇让你对各种前端build工具不再懵逼!

    本文原标题为:我终于弄懂了各种前端build工具 译者:@Christian 译文:https://www.sdk.cn/news/5412 原文:https://medium.freecodecam ...

  7. Servlet学习:实现分页效果的方法

    分页的算法:需要定义四个变量,它们有各自的用处int pageSize:每页显示多少条记录int pageNow:希望显示第几页int pageCount:一共有多少页int rowCount:一共有 ...

  8. Shiro-集成Spring

    集成Spring 加入Spring 和Shiro的jar 包 配置Spring 及SpringMVC 参照:1.3.2\shiro-root-1.3.2-source-release\shiro-ro ...

  9. python 杂七杂八 :

    subprocess.Popen(...) python3 实现代码: 备注write 要使用bytes 在最后结果转为str 显示时才不会出现 b'' 这样的字节显示 import subproce ...

  10. Linux and symmetric multiprocessing

    没空看,暂时留着 http://www.ibm.com/developerworks/library/l-linux-smp/