二叉排序树

来源:互联网 发布:怎样学好高中政治知乎 编辑:程序博客网 时间:2024/06/01 08:07
#include<stdio.h>#include<stdlib.h>typedef int type;typedef struct node{    type key;    struct node *lchild,*rchild;}bsnode;typedef bsnode *bstree;//非递归查找x的位置,通过二级指针返回其父亲节点位置和其位置void bssearch(bstree t,type x,bstree *f,bstree*p){    *f=NULL;    *p=t;    while(*p)    {        if(x==(*p)->key)        return ;        *f=*p;        *p=(x<(*p)->key)?(*p)->lchild:(*p)->rchild;    }    return ;}//递归查找x的位置bstree Bssearch(bstree t ,type x){    if(t==NULL||x==t->key)        return t;    if(x<t->key)        return Bssearch(t->lchild,x);    else return Bssearch(t->rchild,x);}//树中插入一个值为x的节点void insert(bstree *t,type x){    bstree f=NULL,p;//f为插入位置的双亲节点    p=*t;    while(p)    {        if(p->key==x)//已存在该值,结束            return ;        f=p;        if(x<p->key)            p=p->lchild;        else p=p->rchild;    }    p=(bstree)malloc(sizeof(bsnode));    p->key=x;    p->lchild=p->rchild=NULL;    if(*t==NULL)//树为空树,新插入的节点为根节点        *t=p;    else//插入到父节点相应位置    {        if(x<f->key)            f->lchild=p;        else f->rchild=p;    }}//创建一颗树bstree creatbstree(){    bstree t=NULL;    type x;    while(scanf("%d",&x)!=EOF,x>0)        insert(&t,x);    return t;}bstree DelBstree(bstree t,type x){    bstree p,q,child;    //查找到该点的位置,和双亲位置    bssearch(t,x,&p,&q);    if(q)//如果查找到    {        if(q->lchild==NULL&&q->rchild==NULL)//叶子节点        {            if(p)            {                if(p->lchild==q)//是双亲的左儿子树                    p->lchild=NULL;                else p->rchild=NULL;//双亲的右儿子树            }            else t=NULL;//删除的是根节点            free(q);        }        else if(q->rchild==NULL)//只有左儿子树        {            if(p)//存在双亲,将他的左儿子树代替他的位置            {                if(p->lchild==q)//他是他双亲的左儿子树                    p->lchild=q->lchild;//右儿子树                else p->rchild=q->lchild;            }            else t=q->lchild;//被删除的是根节点            free(q);        }        else if(q->lchild==NULL)//只有右儿子树(类似)        {            if(p)            {                if(p->lchild==q)                    p->lchild==q->rchild;                else p->rchild=q->rchild;            }            else t=q->rchild;            free(q);        }        else//既有左子树,又有右子树        {   //将他的右儿子代替他的位置,他的左儿子放在有儿子树中序下首位            child=p->rchild;            while(child->lchild)                child=child->lchild;            child->lchild=q->lchild;//找到右子树中序下首点            if(p)            {                if(p->lchild==q)//他是他双亲的左儿子                    p->lchild=q->rchild;                else p->rchild=q->rchild;            }            else t=q->rchild;//删除的是根节点            free(q);        }    }    return t;}


0 0