第十七章经典抽象数据结构二:树(数组实现)
来源:互联网 发布:淘宝哪里可以回收手机 编辑:程序博客网 时间:2024/05/20 01:43
二叉搜索树插入:
可以首先要判断树是不是为空(针对链表结构是必须的,因为要分配动态内存),然后插入。有2种选择,递归和循环,因为递归是尾部递归,牺牲了空间复杂度获得了可读性,可以转换为循环。
删除结点:
分为3种情况:
1、删除没有孩子的结点,直接删除
2、删除只有一个孩子的结点,删除原有结点,指向孩子结点。
3、删除有2个孩子的结点,删除左子树的最大结点,把值放在当前结点。
代码实现:
tree.h
#ifndef TREE_H#define TREE_Hstatic const int ARRAY_SIZE = 100;static int tree[ARRAY_SIZE];int left_child(int i);int right_child(int i);int find(int i);void insert(int i);void Delete(int i);#endiftree.cpp
#include "tree.h"#include <stdio.h>#include <stdlib.h>#include <assert.h>int left_child(int i){return 2*i+1;}int right_child(int i){return i*2+2;}int find(int i){int a = 0;while(tree[a] != 0){if(tree[a] > i)a = left_child(a);if(tree[a] == i)return a;if(tree[a] < i)a = right_child(a);assert(a<ARRAY_SIZE);}return a;}void insert(int i){assert(i!=0);int current = 0;while(tree[current] != 0){if(tree[current] > i)current = left_child(current);elsecurrent = right_child(current);assert(current < ARRAY_SIZE);}tree[current] = i;}void Delete(int i){int index = find(i);assert(index < ARRAY_SIZE);register int left = left_child(index);register int right = right_child(index);if(tree[left] == 0 && tree[right] == 0)tree[index] = 0;else if(tree[left] == 0){tree[index] = tree[right];//这时候如果right后还有结点有问题!考虑一下tree[right] = 0;}else if(tree[right] == 0){tree[index] = tree[left];tree[left] = 0;}else{int pre;right = left_child(right);while (tree[right] != 0){assert(right < ARRAY_SIZE);pre = right;right = right_child(right);}tree[index] = tree[pre];tree[pre] = 0;}}test.cpp
#include "tree.h"#include <stdio.h>#include <stdlib.h>int main(){insert(20);insert(12);insert(25);insert(5);insert(16);Delete(12);Delete(16);Delete(25);return EXIT_SUCCESS;}
阅读全文
1 0
- 第十七章经典抽象数据结构二:树(数组实现)
- 第十七章经典抽象数据结构四:树的前中后序遍历
- 第十七章经典抽象数据类型(一)
- 经典抽象数据类型之堆栈实现(静态数组)
- 经典抽象数据类型之堆栈实现(动态数组)
- 《大话数据结构》读书笔记之栈抽象数据类型(数组实现)
- 经典数据结构沉思录(二):数组和链表
- 数据结构(二) -- 栈 数组实现
- 经典数据结构--数组实现的栈
- 经典数据结构之数组实现的队列
- 《C和指针》第十二章 使用结构和指针和第十七章 经典抽象数据类型
- 数据结构思维 第十七章 排序
- 《大话数据结构》读书笔记之 队列抽象数据类型(数组实现循环队列)
- 第十七周项目1(拓展)-数据结构拓展之数组操作
- 数据结构与经典算法(二)
- 第十七周项目1-数据结构拓展之数组操作
- 第十七-周-项目二(7)比较两个字符串。(数组法)
- 第十七周-项目二(1)字符串str1与str2的链接。(数组法)
- Java+MySQL实现附近功能
- BZOJ3244:[Noi2013]树的计数 (树的遍历)
- samba
- java实战项目视频学习
- Java问答题(1)
- 第十七章经典抽象数据结构二:树(数组实现)
- 【Scikit-Learn 中文文档】大规模计算的策略: 更大量的数据
- ROS 控制机器人走正方形
- Dijkstra算法 最短路径
- python学习—Day38—memcache安装以及群集操作
- Python中的字符串反转
- 初见C语言
- 通信网络编程第四次作业
- Python--第一个爬虫