二叉查找树

来源:互联网 发布:软件开发工作总结范文 编辑:程序博客网 时间:2024/06/05 19:55
#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 );}elsereturn 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;elsep->rchild = s;return true ;}elsereturn 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 ;elseq->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 );elsereturn 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;}

原创粉丝点击