#include"iostream"
using namespace std;
struct BiTNode
{
int data;
struct BiTNode *lchild,*rchild;
};
typedef struct BiTNode BiTNode,*biTree;
/******************************************
函数名:biTree SearchBST(biTree T,int key)
功能:当二叉树不空时将搜索值与根节点的关键字进行比较,若相等
查找成功,否则根据二者大小关系,分别在左子树和右子树上继续进行查找
******************************************/
biTree SearchBST(biTree T,int key)
{
//在根指针T所指的二叉排序树中递归地查找某关键字等于key的数据元素
//若查找成功,则返回指向数据元素节点的指针,否则,返回空指针
if (T==NULL)
{
return NULL;
}
else
{
if (key==T->data)
{
return T;
}
else if (key<T->data)
{
return (SearchBST(T->lchild,key));
}
else
{
return(SearchBST(T->rchild,key));
}
}
}
/******************************************
函数名:void InsertBST (biTree T , int key)
功能:在BST树中插入一个新结点x时,若BST树为空,
则令新结点x为插入后BST树的根结点;
否则,将结点x的关键字与根结点T的关键字进行比较:
① 若相等: 不需要插入;
② 若x.key<T->key:结点x插入到T的左子树中;
③ 若x.key>T->key:结点x插入到T的右子树中。
由结论知,对于一个无序序列可以通过构造一棵BST树
而变成一个有序序列。
由算法知,每次插入的新结点都是BST树的叶子结点,
即在插入时不必移动其它结点,仅需修改某个结点的指针。
******************************************/
void InsertBST (biTree &T , int key)
{
if (T==NULL)
{
biTree x;
x=new BiTNode;
x->data=key;
x->lchild=x->rchild=NULL;
T=x;
cout<<"插入成功\n";
}
else
{
if (T->data==key)
{
cout<<"节点已存在\n"<<endl;
}
else if (key<T->data)
{
InsertBST(T->lchild,key);
}
else
{
InsertBST(T->rchild,key);
}
}
}
/***************************************
函数名称:biTree CreateTree()
功能:构建二叉树
***************************************/
biTree CreateTree()
{
biTree T=NULL;
int num=0;
cout<<"请输入一次插入的值:";
cin>>num;
while (num!=-1)
{
InsertBST(T,num);
cout<<"下一个插入的值(-1结束):";
cin>>num;
}
cout<<"二叉树建立完成\n";
return T;
}
int dele(biTree &p)
{
biTree q,s;
if (p->lchild==NULL)
{
q=p;
p=p->lchild;
delete q;
}
else if (p->rchild==NULL)
{
q=p;
p=p->rchild;
delete q;
}
else
{
q=p;
s=p->lchild;
while(s->rchild)
{
q=s;
s=s->rchild;
}
p->data=s->data;
if (q!=p)
{
q->rchild=s->lchild;
}
else
{
q->lchild=s->lchild;
}
delete s;
}
return 1;
}
int deleteBTree(biTree &T,int num)
{
if (T==NULL)
{
return 0;
}
else
{
if (num==T->data)
{
return dele(T);
}
else if (num<T->data)
{
return deleteBTree(T->lchild,num);
}
else
{
return deleteBTree(T->rchild,num);
}
}
}
void middVisit(biTree T)
{
if (T==NULL)
{
;
}
else
{
middVisit(T->lchild);
cout<<T->data<<" , ";
middVisit(T->rchild);
}
}
void firstVisit(biTree T)
{
if (T==NULL)
{
;
}
else
{
cout<<T->data<<" , ";
firstVisit(T->lchild);
firstVisit(T->rchild);
}
}
void lastVisit(biTree T)
{
if (T==NULL)
{
;
}
else
{
lastVisit(T->lchild);
lastVisit(T->rchild);
cout<<T->data<<" , ";
}
}
int main()
{
biTree T=CreateTree();
cout<<"中序遍历结果:\n";
middVisit(T);
cout<<endl;
cout<<"前序遍历结果:\n";
firstVisit(T);
cout<<endl;
cout<<"后序遍历结果:\n";
lastVisit(T);
cout<<endl;
deleteBTree(T,7);
cout<<"中序遍历结果:\n";
middVisit(T);
cout<<endl;
return 0;
}
二叉排序树源代码
最新推荐文章于 2020-01-23 17:21:15 发布