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. LinkedList<E>源码分析

    LinkedList的数据结构就是双向链表,如下所示: private static class Node<E> { E item;//数据元素 Node<E> next;// ...

  2. 【机器学习Machine Learning】资料大全

    昨天总结了深度学习的资料,今天把机器学习的资料也总结一下(友情提示:有些网站需要"科学上网"^_^) 推荐几本好书: 1.Pattern Recognition and Machi ...

  3. 【WPF】最近在学习wpf 的绑定,,

    最近在学习wpf 的绑定,,1.简单的说就是版前端和后端用自己的方法给分开了2.baseVm 模型 baseCmd 命令3.命令传参修改的只是界面里的属性,而不修改其它的值4.前端改变后端, 后端改变 ...

  4. .Net Core Linux centos7行—IOC模块

    .net core中可以说是用了全新的IOC模板,定义在Microsoft.Extensions.DependencyInjection下.提供了一套标准的接口.并提供了默认实现.并且大范围使用着,处 ...

  5. swfit-学习笔记(数组的使用)

    Swift数组的使用,参考:<The Swift Programming Language>中文版 // Copyright (c) 2015年 Zsmile. All rights re ...

  6. 点击div 跳转并通过URL传参

    点击div前要先给div绑定要传的参数: //给panel绑定自定义属性,方便在跳转时传带参数,键/值对排列 panel.attr("user_age",user_age); pa ...

  7. 每日一记-mybatis碰到的疑惑:String类型可以传入多个参数吗

    碰到一个觉得很疑惑的问题,Mybatis的parameterType为String类型的时候,能够接收多个参数的吗? 背景 初学Mybatis的时候,看的教程和书籍上都是在说基本的数据类型如:int. ...

  8. iOS之UITableView组头组尾视图/标题悬停

    最近笔者在公司的iOS开发中,有一个iOS开发同事跑来问了两个问题:1.给UITableView设置了组头和组尾视图,但是一直显示不出来?2.UITableView的section的header和fo ...

  9. 【Codeforces163E】e-Government AC自动机fail树 + DFS序 + 树状数组

    E. e-Government time limit per test:1 second memory limit per test:256 megabytes input:standard inpu ...

  10. Linux and symmetric multiprocessing

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