二叉排序树,又名二叉查找树;
二叉排序树是一种用于快速的查询和删除某一元素时建立的数据存储结构;
优点:建立后的树是规则的树,能够快速的(二分查找)查询和删除某一元素;
缺点:平均时间复杂度是logn,当树以自大到小或自小至大的元素顺序进行填充时,复杂度为n,故进一步提出二叉平衡树。
// -1156203886
//BST.H
#ifndef BST_H
#define BST_H
#include <stdio.h>
#include <stdlib.h>
#include <iostream>
using std::cin;
#define OK 1
#define ERROR 0
#define TRUE 1
#define FALSE 0
#define OVERFLOW -2
typedef int Status;
typedef int TElemType;
typedef struct BiTNode
{
TElemType data;
struct BiTNode* lchild;
struct BiTNode* rchild;
}BiTNode, *BiTree;
void judge_in(int &ele)
{
while (!(cin>>ele))
{
cin.clear();
cin.ignore(100,'\n');
printf("请输入1,2,3,4,5中的一个值;\n");
continue;
}
}
Status SearchBST(BiTree T, TElemType e, BiTree f, BiTree* p)//搜寻二叉排序树
//T:要搜寻的树;e:要搜寻的元素;f:被搜寻到元素结点(或叶子节点)的父节点;p:所搜寻到元素结点(或叶子节点的父节点)
{
if (!T)
{
*p = f;
//printf("没有搜寻到元素%d!",e);
return FALSE;
}
else if (e == T->data)
{
*p = T;
printf("树中含有搜寻到元素%d!\n",e);
return TRUE;
}
else if (e < T->data)
return SearchBST(T->lchild, e, T, p);
else
return SearchBST(T->rchild, e, T, p);
}
Status InsertBST(BiTree* T, TElemType e)//插入元素
{
BiTree p, s;
if (!SearchBST(*T, e, NULL, &p))
{
s = (BiTree) malloc(sizeof(BiTNode));
s->data = e;
s->lchild = s->rchild = NULL;
if (!p)
*T = s;
else if (e < p->data)
p->lchild = s;
else
p->rchild = s;
}
return TRUE;
}
Status CreateBST(BiTree* T)
{
TElemType e;
while (TRUE)
{
//scanf("%d", &e);
judge_in(e);
if (e ==0)
break;
InsertBST(T, e);
}
return OK;
}
void PreOrderTraverse(BiTree T)
{
if(T)
{
printf("%d,",T->data);
PreOrderTraverse(T->lchild);
PreOrderTraverse(T->rchild);
}
else
return;
}
Status Delete(BiTree* p)//具体的删除算法
{
BiTree q = (BiTree) malloc(sizeof(BiTNode));
BiTree s = (BiTree) malloc(sizeof(BiTNode));
// BiTree q, s;
if (!((*p)->rchild))//右子树为空时
{
q = *p;
*p = (*p)->lchild;
free(q);
}
else if (!((*p)->lchild))//左子树为空数时
{
q = *p;
*p = (*p)->rchild;
free(q);
}
else//结点有左右子数时
{
q = *p;
s = (*p)->lchild;
while (s->rchild)
{
q = s;
s = s->rchild;
}
//经过while后s结点是所删除结点按照中序遍历时的直接前驱,q则是该直接前驱的父节点
(*p)->data = s->data;
if (q != *p)//
q->rchild = s->lchild;//重接q右子树
else
q->lchild = s->lchild;//重接左子树
free(s);
}
return TRUE;
}
Status DeleteBST(BiTree* T, TElemType e)//删除元素
{
if (!(*T))
{
printf("没有输入的元素%d!\n",e);
return FALSE;
}
else
{
if (e == (*T)->data)
return Delete(T);
else if (e<(*T)->data)
return DeleteBST(&((*T)->lchild), e);
else
return DeleteBST(&((*T)->rchild), e);
}
}
#endif
// BST.cpp : Defines the entry point for the console application.
//
//BST.cpp
#include "stdafx.h"
#include "BST.h"
void main()
{
BiTree tree=NULL;
printf("1代表创建树,2代表对树进行先序遍历,3表示插入新的元素,4表示删除元素,5表示退出");
int ele;
while(TRUE)
{
printf("请输入1,2,3,4,5中的一个值;\n");
judge_in(ele);
if((ele<1)||(ele>5))
continue;
switch(ele)
{
case 1:
CreateBST(&tree);
break;
case 2:
PreOrderTraverse(tree);
break;
case 3:
int e;
judge_in(e);
//scanf("%d",&e);
InsertBST(&tree,e);
break;
case 4:
int el;
judge_in(el);
//scanf("%d",&el);
DeleteBST(&tree,el);
break;
case 5:
exit(0);
}
}
}