定义
二叉搜索树又称二叉查找树、二叉排序树(Binary Sort Tree)。它是一颗空树或是满足下列性质的二叉树:
1)若左子树不空,则左子树上所有节点的值均小于或等于它的根节点的值;
2)若右子树不空,则右子树上所有节点的值均大于或等于它的根节点的值;
3)左、右子树也分别为二叉排序树。
数据结构
二叉树一般采用链式存储方式:每个结点包含两个指针域,指向两个孩子结点,还包含一个数据域,存储结点信息。
typedef struct _BNode
{
int data;
struct _BNode *lchild, *rchild;
}BNode,*BTree;
二叉搜索树插入节点
将要插入的结点 e,与节点 root 节点进行比较,若小于则去到左子树进行比较,若大于则去到右子树进行比较,重复以上
操作直到找到一个空位置用于放置该新节点
bool InsertTree(BTree &BT, BNode *node)
{
BNode *tmp = BT;
BNode *parent = NULL;
if (!node) return false;
node->lchild = NULL;
node->rchild = NULL;
//如果根结点不存在
if (BT == NULL)
{
BT = node;
return true;
}
else
{
tmp = BT;
}
while (tmp != NULL)
{
parent = tmp;
if (isLess(node->data, tmp->data))
tmp = tmp->lchild;
else
tmp = tmp->rchild;
}
if (isLess(node->data, parent->data))
parent->lchild = node;
else
parent->rchild = node;
return true;
}
二叉搜索树删除节点
将要删除的节点的值,与节点 root 节点进行比较,若小于则去到左子树进行比较,若大于则去到右子树进行比较,重复以
上操作直到找到一个节点的值等于删除的值,则将此节点删除。删除时有 4 中情况须分别处理:
//删除BT中值为val的结点 并将删除后的二叉搜索树
BTree DeleteTree(BTree &BT,int val)
{
if (!BT) return NULL;
if (BT->data == val)
{
if (BT->lchild == NULL && BT->rchild == NULL) return NULL;
if (BT->lchild != NULL && BT->rchild == NULL) return BT->lchild;
if (BT->lchild == NULL && BT->rchild != NULL) return BT->rchild;
if (BT->lchild != NULL && BT->rchild != NULL)
{
int tmp= findMax(BT->lchild);//找出左子树中最大的结点值
BT->data = tmp;
BT->lchild = DeleteTree(BT->lchild, tmp);
return BT;
}
}
if (val < BT->data)
{
BT->lchild = DeleteTree(BT->lchild, val);
return BT;
}
if (val > BT->data)
{
BT->rchild = DeleteTree(BT->rchild, val);
return BT;
}
}
二叉搜索树搜索
BNode * QueryTree(BTree BT, int val)
{
if (!BT) return NULL;
if (BT->data == val)
return BT;
else if (isLess(val, BT->data))
return QueryTree(BT->lchild, val);
else
return QueryTree(BT->rchild, val);
}
二叉树的遍历
二叉树的遍历是指从根结点出发,按照某种次序依次访问所有结点,使得每个结点被当且访问一次。共分为四种方式:
前序遍历 - 先访问根节点,然后前序遍历左子树,再前序遍历右子树
void PrePrintTree(BTree BT)
{
if (!BT) return;
cout << BT->data << " ";
PrePrintTree(BT->lchild);
PrePrintTree(BT->rchild);
}
程序清单
// 二叉搜索树.cpp : 此文件包含 "main" 函数。程序执行将在此处开始并结束。
//Author:See QQ3492625357
//源码为本人手写可能有误,若有不当之处欢迎指正
#include <iostream>
#define isLess(a, b) (a<b)
using namespace std;
typedef struct _BNode
{
int data;
struct _BNode *lchild, *rchild;
}BNode,*BTree;
//数据的插入
bool InsertTree(BTree &BT, BNode *node)
{
BNode *tmp = BT;
BNode *parent = NULL;
if (!node) return false;
node->lchild = NULL;
node->rchild = NULL;
//如果根结点不存在
if (BT == NULL)
{
BT = node;
return true;
}
else
{
tmp = BT;
}
while (tmp != NULL)
{
parent = tmp;
if (isLess(node->data, tmp->data))
tmp = tmp->lchild;
else
tmp = tmp->rchild;
}
if (isLess(node->data, parent->data))
parent->lchild = node;
else
parent->rchild = node;
return true;
}
//返回二叉搜索树中的最大值
int findMax(BTree BT)
{
if (!BT) return NULL;
if (BT->rchild==NULL)
{
return BT->data;
}
else
{
return findMax(BT->rchild);
}
}
//删除BT中值为val的结点 并将删除后的二叉搜索树
BTree DeleteTree(BTree &BT,int val)
{
if (!BT) return NULL;
if (BT->data == val)
{
if (BT->lchild == NULL && BT->rchild == NULL) return NULL;
if (BT->lchild != NULL && BT->rchild == NULL) return BT->lchild;
if (BT->lchild == NULL && BT->rchild != NULL) return BT->rchild;
if (BT->lchild != NULL && BT->rchild != NULL)
{
int tmp= findMax(BT->lchild);
BT->data = tmp;
BT->lchild = DeleteTree(BT->lchild, tmp);
return BT;
}
}
if (val < BT->data)
{
BT->lchild = DeleteTree(BT->lchild, val);
return BT;
}
if (val > BT->data)
{
BT->rchild = DeleteTree(BT->rchild, val);
return BT;
}
}
//查找结点
BNode * QueryTree(BTree BT, int val)
{
if (!BT) return NULL;
if (BT->data == val)
return BT;
else if (isLess(val, BT->data))
return QueryTree(BT->lchild, val);
else
return QueryTree(BT->rchild, val);
}
//前序遍历
void PrePrintTree(BTree BT)
{
if (!BT) return;
cout << BT->data << " ";
PrePrintTree(BT->lchild);
PrePrintTree(BT->rchild);
}
//中序遍历
void InOderPrintTree(BTree BT)
{
if (!BT) return;
InOderPrintTree(BT->lchild);
cout << BT->data << " ";
InOderPrintTree(BT->rchild);
}
//后序遍历
void PostPrintTree(BTree BT)
{
if (!BT) return;
PostPrintTree(BT->lchild);
PostPrintTree(BT->rchild);
cout << BT->data << " ";
}
int main()
{
int arr[] = { 19,7,11,15,5,21,25,26,61,99 };
BTree BT=NULL;
//将arr数据插入BT中
for (int i=0;i<sizeof(arr)/sizeof(arr[0]);i++)
{
BNode *node = new BNode;
node->data = arr[i];
InsertTree(BT, node);
}
//遍历BT
PrePrintTree(BT);
cout << endl;
cout << "查找元素15" << endl;
BNode *node = QueryTree(BT, 15);
cout <<"查询出的结果是:"<<node->data << endl;
//删除元素99
BTree BT2 = DeleteTree(BT, 99);
PrePrintTree(BT2);
cout << endl;
}