1、介绍
二叉排序树的中序遍历结果是一个非递减结果。本文介绍二叉排序树的基本实现。
2、数据结构
typedef int ElemType;
typedef struct node{
ElemType data;
node * lchild;
node * rchild;
}BiNode,*BinTree;
3、函数实现
BinTree InitBinTree(ElemType x);
void Insert(BinTree &T, ElemType x);
void LDR(BinTree T);
void Level(BinTree T);
bool search(BinTree T, ElemType x);
void DeleteElem(BinTree &T, ElemType x);
BinTree FindMax(BinTree T);
BinTree FindMin(BinTree T);
3.1 初始化
BinTree InitBinTree(ElemType x){
BinTree T = new BiNode ;
T->data = x;
return T;
}
3.2 插入
将插入的元素与跟节点root的data对比确定插入的是左子树还是右子树,一次类推。
void Insert(BinTree &T, ElemType x){
if(T == NULL){
T = new BiNode;
T->data = x;
}else{
if(x < T->data){
Insert(T->lchild,x);
}else if(x > T->data){
Insert(T->rchild,x);
}else{
return;
}
}
}
3.3 中序遍历
void LDR(BinTree T){
if(T){
LDR(T->lchild);
cout << T->data << " ";
LDR(T->rchild);
}
}
3.4 层序遍历
void Level(BinTree T){
queue<BinTree> q;
q.push(T);
if(T==NULL){
return;
}else{
while(!q.empty()){
BinTree temp = q.front();
q.pop();
cout << temp->data << " ";
if(temp->lchild){
q.push(temp->lchild);
}
if(temp->rchild){
q.push(temp->rchild);
}
}
}
}
3.5 查找
查找也相对简单,因为二叉排序树 左子树 < 根节点< 右子树
bool search(BinTree T, ElemType x){
if(T == NULL){
cout <<"Fail" << endl;
return false;
}
if (T->data == x){
cout << "succsssfully";
return true;
}else if (x < T->data){
search(T->lchild,x);
}else{
search(T->rchild,x);
}
}
3.6 删除
- 如果当前root节点为空,直接返回。
- 如果当前节点的data正好等于x,则进入删除处理
–如果为当前节点没有左右子树,直接让当前节点为null
–如果当前节点存在左子树,让左子树中的最大节点的data覆盖当前节点的data
–如果当前节点存在右子树,让右子树的最小节点的data覆盖当前节点data
-如果当前节点data小于x,则进入右子树。
-如果当前节点大于x,则进入左子树。
void DeleteElem(BinTree &T, ElemType x){
if(T == NULL){
return ;
}else{
if(x == T->data){
if(!T->lchild && !T->rchild){
T = NULL;
}else if (T->lchild){
BinTree pre = FindMax(T->lchild);
T->data = pre->data;
DeleteElem(T->rchild,pre->data);
}else if (T->rchild){
BinTree next = FindMin(T->rchild);
T->data = next->data;
DeleteElem(T->lchild,next->data);
}
}else if (x < T->data){
DeleteElem(T->lchild,x);
}else if (x > T->data){
DeleteElem(T->rchild,x);
}
}
}
3.7 查找T的最大节点
一直往右子树找
BinTree FindMax(BinTree T){
BinTree temp = T;
while(temp->rchild){
temp = temp->rchild;
}
return temp;
}
3.8 查找T的最小节点
一直往左子树找
BinTree FindMin(BinTree T){
BinTree temp = T;
while(temp->lchild){
temp = temp->lchild;
}
return temp;
}
4、 完整代码
#include<iostream>
#include<queue>
using namespace std;
typedef int ElemType;
typedef struct node{
ElemType data;
node * lchild;
node * rchild;
}BiNode,*BinTree;
BinTree InitBinTree(ElemType x);
void Insert(BinTree &T, ElemType x);
void LDR(BinTree T);
void Level(BinTree T);
bool search(BinTree T, ElemType x);
void DeleteElem(BinTree &T, ElemType x);
BinTree FindMax(BinTree T);
BinTree FindMin(BinTree T);
int main(){
BinTree T = InitBinTree(5);
for(int i = 0; i < 10; i++){
int t = random()%10;
Insert(T,t);
}
LDR(T);
cout << endl;
Level(T);
cout << endl;
cout << "I wonder whether 3 is exists" << endl;
search(T,3);
cout << "I want to delete the root node" << endl;
DeleteElem(T,5);
cout << "After Deleting" << endl;
LDR(T);
cout << endl;
Level(T);
cout << endl;
return 0;
}
BinTree InitBinTree(ElemType x){
BinTree T = new BiNode ;
T->data = x;
return T;
}
void LDR(BinTree T){
if(T){
LDR(T->lchild);
cout << T->data << " ";
LDR(T->rchild);
}
}
void Insert(BinTree &T, ElemType x){
if(T == NULL){
T = new BiNode;
T->data = x;
}else{
if(x < T->data){
Insert(T->lchild,x);
}else if(x > T->data){
Insert(T->rchild,x);
}else{
return;
}
}
}
void Level(BinTree T){
queue<BinTree> q;
q.push(T);
if(T==NULL){
return;
}else{
while(!q.empty()){
BinTree temp = q.front();
q.pop();
cout << temp->data << " ";
if(temp->lchild){
q.push(temp->lchild);
}
if(temp->rchild){
q.push(temp->rchild);
}
}
}
}
bool search(BinTree T, ElemType x){
if(T == NULL){
cout <<"Fail" << endl;
return false;
}
if (T->data == x){
cout << "succsssfully";
return true;
}else if (x < T->data){
search(T->lchild,x);
}else{
search(T->rchild,x);
}
}
void DeleteElem(BinTree &T, ElemType x){
if(T == NULL){
return ;
}else{
if(x == T->data){
if(!T->lchild && !T->rchild){
T = NULL;
}else if (T->lchild){
BinTree pre = FindMax(T->lchild);
T->data = pre->data;
DeleteElem(T->rchild,pre->data);
}else if (T->rchild){
BinTree next = FindMin(T->rchild);
T->data = next->data;
DeleteElem(T->lchild,next->data);
}
}else if (x < T->data){
DeleteElem(T->lchild,x);
}else if (x > T->data){
DeleteElem(T->rchild,x);
}
}
}
BinTree FindMax(BinTree T){
BinTree temp = T;
while(temp->rchild){
temp = temp->rchild;
}
return temp;
}
BinTree FindMin(BinTree T){
BinTree temp = T;
while(temp->lchild){
temp = temp->lchild;
}
return temp;
}