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 ...
随机推荐
- linux查看cpu 命令
总核数 = 物理CPU个数 * 每颗物理CPU的核数 总逻辑CPU数 = 物理CPU个数 * 每颗物理CPU的核数 * 超线程数 查看物理CPU个数 cat /proc/cpuinfo| grep & ...
- [LeetCode] Distinct Subsequences 不同的子序列
Given a string S and a string T, count the number of distinct subsequences of T in S. A subsequence ...
- Web javascript 中常用API合集
来源于:https://www.kancloud.cn/dennis/tgjavascript/241852 一.节点 1.1 节点属性 Node.nodeName //返回节点名称,只读 Node. ...
- spriing boot 实战
一.spring基础 1. 依赖注入 我们常说的控制翻转(Inversion of Control -IOC)和依赖注入(dependency injection-DI)在Spring环境下是等同的概 ...
- Jmeter学习笔记TWO
使用非GUI模式运行Jmeter脚本并自动生成测试报告 命令:jmeter -n -t tougu.jmx -l result.jtl -e -o /tmp/ResultReport 这个命令是用于执 ...
- P2特征(一)
很多人在提到项目的特征,肯定能说出来很多的内容,但是在英国体系下,项目的特点有哪些呢?这些特点引深的内容又有什么深度的含义. 项目具有临时性:很多人都知道项目是临时的,结束了就团队成员 ...
- bzoj 2729: [HNOI2012]排队
2729: [HNOI2012]排队 Time Limit: 10 Sec Memory Limit: 128 MB Description 某中学有 n 名男同学,m 名女同学和两名老师要排队参加体 ...
- sql语句,order by
ORDER BY子句必须出现在SELECT中的最后一个子句. 在排序的列中NULL值被认为是最大的. 在SQL语句中给表达式定义别名是一个好习惯. 多列排序时不管升序还是降序,每个列需要单独设置
- BOM操作
BOM操作 //浏览器对象模型 opener=window.open(页面的url,打开方式) opener.document.body.style.background="red" ...
- Spring MVC学习笔记——文件上传
1.实现文件上传首先需要导入Apache的包,commons-fileupload-1.2.2.jar和commons-io-2.1.jar 实现上传就在add.jsp文件中修改表单 enctype= ...