#include<iostream>
using namespace std ;
typedef struct
{
int key ;
}ElemType ;
typedef struct node
{
ElemType data ;
struct node *lchild, *rchild ;
}node , *tree ;
/*在根指针T所指的二叉排序树中递归地查找某关键词等于k的数据元素
若查找成功,则返回指向该数据元素节点的指针,否则返回空指针
*/
bool SearchBST(tree T , int key , tree f , tree &p)
{
if(!T)
{
p = f ;
return false ;
}
else if(key == T->data.key)
{
p = T ;
return true ;
}
else if(key < T->data.key)
{
return SearchBST(T->lchild , key , T , p );
}
else
return SearchBST(T->rchild , key , T , p );
}
/*如果二叉排序数不存在关键词时,插入该关键词,否则返回false*/
bool InsertBST(tree &T , int key )
{
tree p ;
if(!SearchBST(T , key , NULL , p))
{
cout<<"二叉树不存这个点,插入数据到二叉树中"<<endl ;
tree s;
s = (tree)malloc(sizeof(node)) ;
s->data.key = key;
s->lchild = s->rchild = NULL ;
if(!p)
T = s;
else if (key < p->data.key)
p->lchild = s;
else
p->rchild = s;
return true ;
}
else
return false ;
}
/*将数据输出*/
void outprint(int e)
{
cout<<e ;
}
/*遍历二叉树*/
void TraTree(tree T)
{
if(T)
{
TraTree(T->lchild) ;
outprint(T->data.key);
TraTree(T->rchild) ;
}
return ;
}
/*从二叉树中删除节点P,并重接它的左右子树*/
bool Delete(tree &p)
{
tree 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 ;
}
p -> data = s->data ;
if(q != p )
q->rchild = s->lchild ;
else
q->lchild = s->lchild ;
free(s);
}
return true ;
}
/*如果二叉树存在关键词key,则删除这个点,并返回true , 否则返回false */
bool DeleteBST(tree &T , int key )
{
if(!T)
return false ;
else
{
if(key == T->data.key)
return Delete(T);
else if(key<T->data.key)
return DeleteBST(T->lchild , key );
else
return DeleteBST(T->rchild , key );
}
}
int main(void)
{
tree T= NULL ;
/*初始化树*/
int n ;
/*插入关键词到二叉树*/
while(cin >> n && n )
InsertBST(T , n ) ;
cout<<"遍历二叉树: ";
TraTree(T);
cout<<endl;
/*删除二叉树的某个关键词*/
cout<<"输入要删除的点"<<endl;
while(cin>>n && n)
{
cout<<"输入要删除的点"<<endl;
DeleteBST( T , n) ;
TraTree(T);
cout<<endl;
}
return 0;
}
二叉查找树
最新推荐文章于 2024-11-20 23:12:07 发布