二叉排序树(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=0;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] = {62,88,58,47,35,73,51,99,37,93,23,27,45,21,12};
BiTree biTree = NULL;
/** 创建二叉排序树,并测试数据 **/
createBiOrderTree(biTree,arr);
midSearchBiTreePrint(biTree);
printf("\n");
/** 从二叉排序树中删除指定元素,并测试数据 **/
deleteNode(biTree,35);
midSearchBiTreePrint(biTree);
printf("\n");
/** 二叉排序树查找指定元素操作,并测试数据 **/
BiTree searchNode = BST_Search(biTree,27);
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 0;
}
运行结果截图: