- 论坛徽章:
- 0
|
问题已经解决,代码如下
- binarytree.h
- struct tree
- {
- int data;
- int visited; //0 visited ,1 unvisited
- struct tree *left,*right;
- };
- typedef struct tree Tree;
- int bs_search(Tree *base , int key,Tree **p);
- void insert(Tree **base, int key);
- int delete_bst(Tree **base ,int key);
- int delete(Tree **p);
- void travel(Tree *base); //inorder
- void initial(Tree **base);
- binarytree.c
- #include<stdio.h>
- #include<stdlib.h>
- #include "binarytree.h"
- //1 declare success ,0 declare fail
- int bs_search(Tree *base , int key,Tree **p)
- {
- if(base==NULL)
- {
- *p=NULL;
- return 0;
- }
- else
- {
- Tree *temp,*parent;
- temp=base;
- while(temp!=NULL)
- {
- if(temp->data==key)
- {
- *p=temp;
- return 1;
- }
- else if(temp->data<key)
- {
- parent=temp;
- temp=temp->right;
- }
- else
- {
- parent=temp;
- temp=temp->left;
- }
- }
- *p=parent;
- return 0;
- }
- }
- void insert(Tree **base,int key)
- {
- Tree **p;
- Tree *temp;
- p=(Tree **)malloc(sizeof(Tree));
- if(bs_search(*base,key,p)==0)
- {
- Tree *s=(Tree *)malloc(sizeof(Tree));
- s->right=s->left=NULL;
- s->data=key;
- s->visited=0;
- if(*p==NULL)
- {
- *base=s;
- }
- else if(key>(*p)->data)
- {
- temp=*p;
- temp->right=s;
- }
- else
- {
- temp=*p;
- temp->left=s;
- }
- }
- free(p);
- }
- void travel(Tree *base)
- {
- if(base==NULL)
- return;
- else if(base->visited==0)
- {
- base->visited=1;
- travel(base->left);
- printf(" %d ",base->data);
- travel(base->right);
- }
- }
- int delete_bst(Tree **base , int key)
- {
- if(*base==NULL)
- return 0;
- else if(key==(*base)->data)
- return delete(base);
- else if(key>(*base)->data)
- return delete(&((*base)->right));
- else
- return delete(&((*base)->left));
- }
- int delete(Tree **p)
- {
- Tree *q;
- if((*p)->right==NULL)
- {
- q=*p;
- *p=(*p)->left;
- free(q);
- }
- else if((*p)->left==NULL)
- {
- q=*p;
- *p=(*p)->right;
- free(q);
- }
- else
- {
- Tree *s;
- q=*p;
- s=(*p)->left;
- while(s->right!=NULL)
- {
- q=s;
- s=s->right;
- }
- (*p)->data=s->data;
- if(q!=*p)
- q->right=s->left;
- else
- q->left=s->left;
- free(s);
- }
- return 1;
- }
- void initial(Tree **base)
- {
- if(*base==NULL)
- return;
- (*base)->visited=0;
- initial(&((*base)->left));
- initial(&((*base)->right));
- }
复制代码 |
|