<数据结构>BinarySearchTree的基本操作总结
ADT
结构声明
#include<stdio.h>
#include<stdlib.h>
#define ElementType int
struct TreeNode;
typedef struct TreeNode *Position;
typedef struct TreeNode *SearchTree;
struct TreeNode
{
ElementType Element;
SearchTree Left;
SearchTree Right;
};
核心操作集
Position Find(int X, SearchTree T);
SearchTree Insert(int X, SearchTree T);
SearchTree Delete(int X, SearchTree T);
void PreOrderTraversal(SearchTree BT);
void InOrderTraversal(SearchTree BT);
void PostOrderTraversal(SearchTree BT);
void LevelOrderTraversal(SearchTree BT);
各操作实现
说明:SearchTree是递归定义,故操作多以递归实现,不再尝试转换为非递归实现
Find(),Insert(),Delete()
Position Find(int X, SearchTree T)
{
if(T == NULL)
return NULL;
if(X < T->Element)
return Find(X, T->Left);
else
if(X > T->Element)
return Find(X, T->Right);
else
return T;
}
SearchTree Insert(int X, SearchTree T)
{
if(T == NULL)
{
/*creat and return a one-node tree*/
T = (SearchTree)malloc(sizeof(struct TreeNode));
T->Element = X;
T->Left = T->Right = NULL;
}
else
if(X < T->Element)
T->Left = Insert(X, T->Left);
else
if(X > T->Element)
T->Right = Insert(X, T->Right);
return T;
}
SearchTree Delete(int X, SearchTree T)
{
Position TmpCell;
if(T == NULL)
printf("Element not found");
else
if(X < T->Element) /*Go Left*/
T->Left = Delete(X, T->Left);
else
if(X > T->Element) /*Go Right*/
T->Right = Delete(X, T->Right);
else
if(T->Left && T->Right) /*Two children*/
{
TmpCell = FindMax(T->Right);
T->Element = TmpCell->Element;
T->Right = Delete(T->Element, T->Right);
}
else /*One or Zero Children*/
{
TmpCell = T;
if(T->Left == NULL)
T = T->Right;
if(T->Right == NULL)
T = T->Left;
free(TmpCell);
}
return T;
}
Traverse():前中后、层
void PreOrderTraverse(BinaryTree BT)
{
if(BT)
{
printf("%d", BT->Element);
PreOrderTraversal(BT->Left);
PreOrderTraversal(BT->Right);
}
}
InOrderTraverse()以及PostOrderTraverse()只需改变'printf()'位置即可'
void LevelOrderTraversal(BinaryTree BT)
{
/*手法类似于BFS*/
queue<BinaryTree> Q;
BinaryTree T;
if(!BT) return;
Q.push(BT);
while(!Q.empty())
{
T = Q.front();
printf("%d ",T->Element);
Q.pop();
if(T->Left) Q.push(T->Left);
if(T->Right) Q.push(T->Right);
}
}
<数据结构>BinarySearchTree的基本操作总结的更多相关文章
- Redis数据结构之sds基本操作函数
本文及后续文章,Redis版本均是v3.2.8 本篇文章讲解sds基本操作函数,我们从源码角度来进一步理解. 一.sds创建函数和销毁 sds创建函数 /* Create a new sds stri ...
- c数据结构栈的基本操作(字符逆序输出)
线性栈 输入字符,再输出 #include "stdafx.h" #include<stdlib.h> #include<malloc.h> #define ...
- Python之数据结构:列表
列表:处理一组有序项目的数据结构 一.基本操作 1.列表运算符 list1=[2,3,4,5,6,7,8] print len(list1) print [1,2]+[3,4] print ['Hi' ...
- Python学习-第二天-字符串和常用数据结构
Python学习-第二天-字符串和常用数据结构 字符串的基本操作 def main(): str1 = 'hello, world!' # 通过len函数计算字符串的长度 print(len(str1 ...
- Javascript设计模式之我见:迭代器模式
大家好!本文介绍迭代器模式及其在Javascript中的应用. 模式介绍 定义 提供一种方法顺序一个聚合对象中各个元素,而又不暴露该对象内部表示. 类图及说明 Iterator抽象迭代器 抽象迭代器负 ...
- 栈的C数组实现
栈是一种先进后出的数据结构.栈的基本操作包括:入栈,出栈,初始化栈,清空栈,遍历栈. C代码如下: #include <stdio.h> #define MaxSize 20 typede ...
- 堆C数组实现
堆栈是一个最后出来该数据结构. 栈的基本操作包含:入栈,出栈,初始化栈,清空栈,遍历栈. C代码例如以下: #include <stdio.h> #define MaxSize 20 ty ...
- Java Collections API和泛型
Java Collections API和泛型 数据结构和算法 学会一门编程语言,你可以写出一些可以工作的代码用计算机来解决一些问题,然而想要优雅而高效的解决问题,就要学习数据结构和算法了.当然对数据 ...
- Mina源码阅读笔记(五)—Mina对连接的操作IoSession
IoSession是Mina管理两端的一个重要部分,也是Mina的核心,Session具有了生命周期的概念,它的生命周期和连接时紧密相关的,这点在后面的介绍中会涉及.另外,好像hibernate中也有 ...
随机推荐
- 【Reverse】DLL注入
DLL注入就是将dll粘贴到指定的进程空间中,通过dll状态触发目标事件 DLL注入的大概流程 https://uploader.shimo.im/f/CXFwwkEH6FPM0rtT.png!thu ...
- RAC中常见的高级用法-过滤
filter 过滤信号,使用它可以获取满足条件的信号. - (void)filter { //只有当我们文本框内容长度大于5才想要获取文本框的内容 [[_passWord.rac_textS ...
- 使用NSURLSessionDownloadTask实现大文件下载-监听下载进度
- 5.1 涉及知识点(1)创建NSURLSession并设置代理,通过NSURLSessionDownloadTask并以代理的方式来完成大文件的下载 //1.创建NSURLSession,设置代理 ...
- 【Java基础】Java反射——Private Fields and Methods
Despite the common belief it is actually possible to access private fields and methods of other clas ...
- Redis,Memcache,MongoDb的特点与区别
Redis Redis 简介 Redis 是完全开源免费的,遵守BSD协议,是一个高性能的key-value数据库. Redis 与其他 key - value 缓存产品有以下三个特点: Redis支 ...
- SSO(单点登录)示例
此文为转载文章,出处:https://www.cnblogs.com/jpfss/p/9273680.html SSO在我们的应用中非常常见,例如我们在OA系统登录了,我们就可以直接进入采购系统,不需 ...
- matplotlib画散点图和柱状图,等高线图,image图
一:散点图: scatter函数原型 其中散点的形状参数marker如下: 其中颜色参数c如下: n = 1024 # 均值是0, 方差是1, 取1024个数 x = np.rando ...
- 机器学习——sklearn中的API
import matplotlib.pyplot as pltfrom sklearn.svm import SVCfrom sklearn.model_selection import Strati ...
- Jenkins动态选择分支/tag
目录 一.简介 二.配置 三.配置tag 四.其它方法 五.List Git Branches插件 一.简介 一般选择分支构建,Git Parameter插件即可.这里是应用pipline的同时,可以 ...
- Nginx模块之ngx_http_gzip_module
Module ngx_http_gzip_module 该ngx_http_gzip_module模块是一个使用"gzip"方法压缩响应的过滤器.这通常有助于将传输数据的大小减少一 ...