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的基本操作总结的更多相关文章

  1. Redis数据结构之sds基本操作函数

    本文及后续文章,Redis版本均是v3.2.8 本篇文章讲解sds基本操作函数,我们从源码角度来进一步理解. 一.sds创建函数和销毁 sds创建函数 /* Create a new sds stri ...

  2. c数据结构栈的基本操作(字符逆序输出)

    线性栈 输入字符,再输出 #include "stdafx.h" #include<stdlib.h> #include<malloc.h> #define ...

  3. Python之数据结构:列表

    列表:处理一组有序项目的数据结构 一.基本操作 1.列表运算符 list1=[2,3,4,5,6,7,8] print len(list1) print [1,2]+[3,4] print ['Hi' ...

  4. Python学习-第二天-字符串和常用数据结构

    Python学习-第二天-字符串和常用数据结构 字符串的基本操作 def main(): str1 = 'hello, world!' # 通过len函数计算字符串的长度 print(len(str1 ...

  5. Javascript设计模式之我见:迭代器模式

    大家好!本文介绍迭代器模式及其在Javascript中的应用. 模式介绍 定义 提供一种方法顺序一个聚合对象中各个元素,而又不暴露该对象内部表示. 类图及说明 Iterator抽象迭代器 抽象迭代器负 ...

  6. 栈的C数组实现

    栈是一种先进后出的数据结构.栈的基本操作包括:入栈,出栈,初始化栈,清空栈,遍历栈. C代码如下: #include <stdio.h> #define MaxSize 20 typede ...

  7. 堆C数组实现

    堆栈是一个最后出来该数据结构. 栈的基本操作包含:入栈,出栈,初始化栈,清空栈,遍历栈. C代码例如以下: #include <stdio.h> #define MaxSize 20 ty ...

  8. Java Collections API和泛型

    Java Collections API和泛型 数据结构和算法 学会一门编程语言,你可以写出一些可以工作的代码用计算机来解决一些问题,然而想要优雅而高效的解决问题,就要学习数据结构和算法了.当然对数据 ...

  9. Mina源码阅读笔记(五)—Mina对连接的操作IoSession

    IoSession是Mina管理两端的一个重要部分,也是Mina的核心,Session具有了生命周期的概念,它的生命周期和连接时紧密相关的,这点在后面的介绍中会涉及.另外,好像hibernate中也有 ...

随机推荐

  1. Yarn【架构、原理、多队列配置】

    目录 一.什么是yarn 二.yarn的基本架构和角色 三.yarn的工作机制 四.任务提交流程 五.资源调度器 FIFO 容量调度器 公平调度器 六.容量调度器多队列提交案例实操 1.案例:配置de ...

  2. ubuntu18.10搜狗输入法的安装

    记录一下 1.卸载ibus ubuntu默认使用ibus管理输入法,官方推荐使用fcitx.我们先卸载ibus sudo apt-get remove ibus 清除ibus配置,如果没有设置 sud ...

  3. nodejs-CommonJS规范

    JavaScript 标准参考教程(alpha) 草稿二:Node.js CommonJS规范 GitHub TOP CommonJS规范 来自<JavaScript 标准参考教程(alpha) ...

  4. go 代理

    环境变量中设置 #GO111MODULE=auto GOPROXY=https://goproxy.io 如果不第一次,则在命令行设置 go env -w GO111MODULE=on go env ...

  5. MyBatis通过注解实现映射中的嵌套语句和嵌套结果

    案例描述:查看订单或购物车订单信息的同时查询出该订单中所有书籍的信息. 一.嵌套语句 @Select("select* from shopcart where shopcartid = #{ ...

  6. seata服务端和客户端配置(使用nacos进行注册发现,使用mysql进行数据持久化),以及过程中可能会出现的问题与解决方案

    seata服务端和客户端配置(使用nacos进行注册发现,使用mysql进行数据持久化),以及过程中可能会出现的问题与解决方案 说明: 之所以只用nacos进行了注册与发现,因为seata使用naco ...

  7. C#深入理解多态

    1.里氏替换原则 1.里氏替换原则:在一个软件系统中,如果子类出现在父类出现的位置,而整个软件功能又没有影响,那么咱们称为里氏替换. 2. 考试题:父类变量指向子类对象!! 3.里氏替换  是     ...

  8. Python用matplotlib绘图网格线的设置

    一.X轴网格线的设置 import matplotlib.pyplot as plt import numpy as np from pylab import mpl mpl.rcParams['fo ...

  9. MySQL如何使用WITH ROLLUP函数

    一.WITH ROLLUP函数适用于跟在GROUP BY 字段后面进行分组求和使用 SELECT t1.`产品名称`,SUM(t1.`数量`),SUM(t1.`金额`),t1.`日期` FROM sh ...

  10. [BUUCTF]PWN——bjdctf_2020_babyrop2

    bjdctf_2020_babyrop2 附件 步骤: 例行检查,64位程序,开启了NX和canary保护 2. 试运行一下程序,看看大概的情况 提示我们去泄露libc 3. 64位ida载入,从ma ...