C和指针 第十七章 习题
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和指针 第十七章 习题的更多相关文章
- C和指针 第六章 习题
6.1编写一个函数,它在一个字符串中进行搜索,查找所有在一个给定字符集中出现的字符,返回第一个找到的字符位置指针,未找到返回NULL #include <stdio.h> char * f ...
- C和指针 第十七章 二叉树删除节点
二叉树的节点删除分为三种情况: 1.删除的节点没有子节点,直接删除即可 2. 删除的节点有一个子节点,直接用子节点替换既可以 3.删除的节点有两个子节点. 对于第三种情况,一般是不删除这个节点,而是删 ...
- C和指针 第十七章 经典数据类型 堆栈 队列 二叉树
堆栈: // // Created by mao on 16-9-16. // #ifndef UNTITLED_STACK_H #define UNTITLED_STACK_H #define TR ...
- C和指针 第十三章 习题
1,1标准输入读入字符,统计各类字符所占百分比 #include <stdio.h> #include <ctype.h> //不可打印字符 int isunprint(int ...
- C和指针 第十一章 习题
1编写calloc,内部使用malloc函数获取内存 #include <stdio.h> #include <stdlib.h> void *myAlloc(unsigned ...
- C和指针 第七章 习题
7.1 hermite递归函数 int hermite(int n, int x) { if (n <= 0) { return 1; } if (n == 1) { return 2 * x; ...
- C和指针 第五章 习题
下列输出的值: #include <stdio.h> int func(){ static int count = 1; return ++count; } int main() { in ...
- C和指针 第四章 习题
4.1正数的n的平方根可以通过: ai+1= (ai + n / ai ) / 2 得到,第一个a1是1,结果会越来越精确. #include <stdio.h> int main() { ...
- C和指针 第三章 习题
在一个源文件中,有两个函数x和y,定义一个链接属性external储存类型static的变量a,且y可以访问,x不可以访问,该如何定义呢? #include <stdio.h> void ...
随机推荐
- Windows 上如何安装Sqlite
对SQLite文明已久,却是从来没使用过,今天就来安装试用下. 一.安装 下载地址:http://www.sqlite.org/download.html 将Precompiled Binaries ...
- Linux 进程与线程五
pthread_self函数 pthread_t pthread_self(void); 一般会成功,返回当前线程的ID 注意:在子线程中执行exit()函数会退出整个进程,一般使用pthread_e ...
- [LeetCode] Number of Digit One 数字1的个数
Given an integer n, count the total number of digit 1 appearing in all non-negative integers less th ...
- [LeetCode] Rectangle Area 矩形面积
Find the total area covered by two rectilinear rectangles in a2D plane. Each rectangle is defined by ...
- JS组件系列——BootstrapTable+KnockoutJS实现增删改查解决方案(四):自定义T4模板快速生成页面
前言:上篇介绍了下ko增删改查的封装,确实节省了大量的js代码.博主是一个喜欢偷懒的人,总觉得这些基础的增删改查效果能不能通过一个什么工具直接生成页面效果,啥代码都不用写了,那该多爽.于是研究了下T4 ...
- IE兼容方法
其实我也觉得非常麻烦,开始的时候都用 _XXX:XXX; /* IE6支持 */ *XXX:XXX; /* IE6.IE7支持 */ *+XXX:XXX; /* IE7支持 */ XXX:XXX\9; ...
- JavaScript事件详解-jQuery的事件实现(三)
正文 本文所涉及到的jQuery版本是3.1.1,可以在压缩包中找到event模块.该篇算是阅读笔记,jQuery代码太长.... Dean Edward的addEvent.js 相对于zepto的e ...
- jquery和zepto的扩展方法extend
jquery和zepto的扩展方法extend 总结下jQuery(3.1.1)和zepto(1.1.6)到底是如何来开放接口,使之可以进行扩展,两者都会有类型判断,本文使用简单的类型判断,暂不考虑兼 ...
- js定位
1.引入 百度地图js(1.3以后需要key) <script type="text/javascript" src="http://api.map.baidu.c ...
- [C#] NPOI Excel解析
通过NPOI解析Excel,将数据保存到DataTable中. #region excel解析 public DataTable ImportExcelFile(string filePath) { ...