二叉排序树(BST)创建,删除,查找操作
binary search tree,中文翻译为二叉搜索树、二叉查找树或者二叉排序树。简称为BST
一:二叉搜索树的定义
他的定义与树的定义是类似的,也是一个递归的定义:
1、要么是一棵空树
2、如果不为空,那么其左子树节点的值都小于根节点的值;右子树节点的值都大于根节点的值
3、其左右子树也是二叉搜索树
在算法导论中的定义:

下图中是BST的两个例子:

其中(b)图中的树是很不平衡的(所谓不平衡是值左右子树的高度差比较大)
BST在数据结构中占有很重要的地位,一些高级树结构都是其的变种,例如AVL树、红黑树等,因此理解BST对于后续树结构的学习有很好的作用。同时利用BST可以进行排序,称为二叉排序,也是很重要的一种思想。
相关代码如下:
/** 二叉排序树(BST)创建,删除,查找操作 **/
#include<stdio.h>
#include<stdlib.h>
#define LENGTH 15 typedef int ElemType; //数据类型 typedef struct BiTNode{
ElemType data;
struct BiTNode *lchild;
struct BiTNode *rchild;
}BiTNode,*BiTree; /**
* 向下遍历查找给定结点的相邻节点,以便插入指定节点
*/
void searchBiTreeNode(BiTree &root,BiTree &node){
if(root == NULL){
return;
}
if(root->data > node->data){
searchBiTreeNode(root->lchild,node); //递归遍历搜索
if(root->lchild == NULL){
root->lchild = node;
}
}else if(root->data < node->data){
searchBiTreeNode(root->rchild,node);
if(root->rchild == NULL){
root->rchild = node;
}
}
} /**
* 插入指定节点node
*/
void insertNode(BiTree &biTree,BiTree &node){
if(biTree==NULL){
biTree = node;
}else{
searchBiTreeNode(biTree,node);
}
} /**
* 删除指定元素x
*/
void deleteNode(BiTree &root,ElemType x){
if(root == NULL){
return;
}
if(root->data>x){
deleteNode(root->lchild,x);
}else if(root->data<x){
deleteNode(root->rchild,x);
}else{ //查找到了删除节点
if(root->lchild == NULL){ //左子树为空
BiTree tempNode = root;
root = root->rchild;
free(tempNode);
}else if(root->rchild == NULL){ //右子树为空
BiTree tempNode = root;
root = root->lchild;
free(tempNode);
}else{ //左右子树都不为空
//一般的删除策略是左子树的最大数据 或 右子树的最小数据 代替该节点(这里采用查找左子树最大数据来代替)
BiTree tempNode = root->lchild;
if(tempNode->rchild!=NULL){
tempNode = tempNode->rchild;
}
root->data = tempNode->data;
deleteNode(root->lchild,tempNode->data);
}
}
} /**
* 查找指定元素x所在的节点
*/
BiTree BST_Search(BiTree &root,ElemType x){
if(root == NULL){
return NULL;
}else if(root->data>x){
return BST_Search(root->lchild,x);
}else if(root->data<x){
return BST_Search(root->rchild,x);
}else{
return root;
}
} /**
* 二叉排序树创建
*/
void createBiOrderTree(BiTree &biTree,ElemType arr[]){
for(int i=;i<LENGTH;i++){
BiTree s = (BiTree)malloc(sizeof(BiTNode));
s->data = arr[i];
s->lchild = NULL;
s->rchild = NULL;
insertNode(biTree,s);
}
} /**
* 中序打印二叉树
*/
void midSearchBiTreePrint(BiTree &biTree){
if(biTree == NULL){
return;
}
midSearchBiTreePrint(biTree->lchild);
printf("%d ",biTree->data);
midSearchBiTreePrint(biTree->rchild);
} /**
* 测试程序入口
*/
int main(){
ElemType arr[LENGTH] = {,,,,,,,,,,,,,,};
BiTree biTree = NULL; /** 创建二叉排序树,并测试数据 **/
createBiOrderTree(biTree,arr);
midSearchBiTreePrint(biTree);
printf("\n"); /** 从二叉排序树中删除指定元素,并测试数据 **/
deleteNode(biTree,);
midSearchBiTreePrint(biTree);
printf("\n"); /** 二叉排序树查找指定元素操作,并测试数据 **/
BiTree searchNode = BST_Search(biTree,);
if(searchNode == NULL){
fprintf(stdout,"没有查找到节点\n");
}else{
if(searchNode->lchild==NULL && searchNode->rchild==NULL){ //叶子节点
printf("所查找的节点x=%d是叶子节点\n",searchNode->data);
}else{
if(searchNode->lchild != NULL){
printf("x=%d所在节点的左孩子: %d\n",searchNode->data,searchNode->lchild->data);
}
if(searchNode->rchild != NULL){
printf("x=%d所在节点的右孩子: %d\n",searchNode->data,searchNode->rchild->data);
}
}
}
return ;
}
运行结果截图:

二叉排序树(BST)创建,删除,查找操作的更多相关文章
- 二叉排序树的创建删除中序输出&&平衡树
#include<iostream> #include<cstdio> #include<cstring> #include<cmath> #inclu ...
- Java实现二叉排序树的插入、查找、删除
import java.util.Random; /** * 二叉排序树(又称二叉查找树) * (1)能够是一颗空树 * (2)若左子树不空,则左子树上全部的结点的值均小于她的根节点的值 * (3)若 ...
- DOM操作 ——如何添加、移除、移动、复制、创建和查找节点等。
DOM操作 --如何添加.移除.移动.复制.创建和查找节点等. (1)创建新节点 createDocumentFragment() //创建一个DOM片段 createElement() //创建一个 ...
- [No000005]C#注册表操作,创建,删除,修改,判断节点是否存在
//用.NET下托管语言C#操作注册表,主要内容包括:注册表项的创建,打开与删除.键值的创建(设置值.修改),读取和删除.判断注册表项是否存在.判断键值是否存在. //准备工作: //1:要操作注册表 ...
- c# 注册表操作,创建,删除,修改,判断节点是否存在
用.NET下托管语言C#操作注册表,主要内容包括:注册表项的创建,打开与删除.键值的创建(设置值.修改),读取和 删除.判断注册表项是否存在.判断键值是否存在. 准备工作: 1:要操作注册表,我们必须 ...
- JS中的DOM操作怎样添加、移除、移动、复制、创建和查找节点
DOM操作怎样添加.移除.移动.复制.创建和查找节点? (1)创建新节点 createDocumentFragment() //创建一个DOM片段 createElement() //创建一个具体的元 ...
- 二叉排序树(BST)构造与应用
二叉排序树(BST)构造与应用 本文取自<数据结构与算法>(C语言版)(第三版).出版社是清华大学出版社. 本博文作为学习资料整理. 源码是VC+ ...
- 【ASP.NET Web API教程】2.1 创建支持CRUD操作的Web API
原文 [ASP.NET Web API教程]2.1 创建支持CRUD操作的Web API 2.1 Creating a Web API that Supports CRUD Operations2.1 ...
- WebLogic Server添加删除补丁操作【转】【补】
WebLogic Server添加删除补丁操作 0 查看当前weblogic版本 [weblogic@localhost bin]$ cd /data/bea/weblogic11/wlserver_ ...
随机推荐
- ArcGIS Engine开发前基础知识(3)
对象模型图 一.对象模型图中的类与接口 ArcGIS Engine 提供大量的对象,这些对象之间存在各种各样的关系,如继承.组合.关联等.对象模型图(Object model diagram,ODM) ...
- Sharepoint 2010、Sharepoint 2013浏览器打开CAD(.dwg)
客户端配置 1.安装FreeDWGViewer.exe,设置浏览器查看 2.检查ActiveX插件是否已安装成功 服务端配置 1.开启许可模式或者通过脚本将"application/acad ...
- swift学习笔记5——其它部分(自动引用计数、错误处理、泛型...)
之前学习swift时的个人笔记,根据github:the-swift-programming-language-in-chinese学习.总结,将重要的内容提取,加以理解后整理为学习笔记,方便以后查询 ...
- floyd算法学习笔记
算法思路 路径矩阵 通过一个图的权值矩阵求出它的每两点间的最短路径矩阵.从图的带权邻接矩阵A=[a(i,j)] n×n开始,递归地进行n次更新,即由矩阵D(0)=A,按一个公式,构造出矩阵D(1):又 ...
- iOS App 不支持http协议 App Transport Security has blocked a cleartext HTTP (http://)
目前iOS已经不支持http协议了,不过可以通过info.plist设置允许 App Transport Security has blocked a cleartext HTTP (http://) ...
- C#接口的显示和隐式实现
早上骑车上班走到半路发现手机忘带了,这年代兜里没装一分现金,吃饭都要刷手机,上班时间无聊了不能玩手机更是大问题,所以果断掉头拿手机.取完手机刚出门看这天阴沉沉的貌似要下雨,没雨衣,骑车又不能打伞,上次 ...
- ambari2.4.2_centos7 学习全纪录
目录: 为什么要用Ambari 概念概述 原理简介 安装 创建集群 创建集群 手动修改配置 NameNode HA 安装SmartSense 二次开发 为什么要用Ambari Ambari 是 Apa ...
- 关于Redis的ACID
事务是一个数据库必备的元素,对于redis也不例外,对于一个传统的关系型数据库来说,数据库事务满足ACID四个特性: A代表原子性:一个事务(transaction)中的所有操作,要么全部完成,要么全 ...
- 在Ubuntu Server 14.04中搭建FTP服务器(VMWare)
自己搭建ftp服务器,方便主机与虚拟机中的Ubuntu传输文件. 选用的ftp软件为vsftpd. 1.命令行: sudo apt-get install vsftpd 2.安装完配置: vsftpd ...
- [AR]ImageTarget(图像识别)
ImageTarget 前言 ImageTarget 顾名思义,就是图像识别,本文记录下作者最近学习vuforia中的imageTarget笔记与心得. vuforia guide:https://l ...