C语言实现常用数据结构——二叉树

#include<stdio.h>
#include<stdlib.h>
#define SIZE 10
typedef struct Tree {
    int data;
    struct Tree *left;
    struct Tree *right;
} tree;



int find(tree *t,int x) {
    int i=0;
    if(t==NULL) {
        return -1;
    }
    if(t->data==x) {
        return i;
    } else if(x<t->data) {
        i++;
        find(t->left,x);
    } else if(x>t->data) {
        i++;
        find(t->right,x);
    }
}

tree *findMin(tree *t) {
    if(t==NULL) {
        return NULL;
    } else if(t->left==NULL) {
        return t;
    } else {
        return findMin(t->left);
    }
}

int findMax(tree *t) {
    if(t!=NULL) {
        while(t->right!=NULL) {
            t=t->right;
        }
    }
    return t->data;
}

tree *init(tree *t,int x) {
    if(t==NULL) {
        t=malloc(sizeof(tree));
        t->data=x;
        t->left=NULL;
        t->right=NULL;
        return t;
    } else if(t->left ==NULL) {
        t->left=init(t->left,x);
        return t;
    } else {
        t->right=init(t->right,x);

        return t;
    }
}



tree *insertSort(tree *t,int x) {
    if(t==NULL) {
        t=malloc(sizeof(tree));
        t->data=x;
        t->left=NULL;
        t->right=NULL;
    } else if(x < t->data) {
        t->left=insertSort(t->left,x);
    } else if(x > t->data) {
        t->right=insertSort(t->right,x);
    }
    return t;
}


tree *delete(tree *t,int x) {
    tree *temp;
    if(t==NULL) {
        printf("error,element not found!");
    } else if( x < t->data ) {/*go left*/
        t->left=delete(t->left,x);
    } else if( x > t->data ) {/*go right*/
        t->right=delete( t->right,x );
    } else if( t->left && t->right) { /*t->data==x and t has two children*/
        temp=findMin( t->right );
        t->data=temp->data;
        t->right=delete( t->right,t->data );
    } else {/*one or zero children */
        temp=t;
        if( t->left==NULL) {
            t=t->right;
        } else if( t->right == NULL ) {
            t=t->left;
        }
        free(temp);
    }
    return t;
}

void preTravel(tree *t) {
    if(t==NULL) {
        return;
    }
    printf("%d ",t->data);
    preTravel(t->left);
    preTravel(t->right);
}

void midTravel(tree *t) {
    if(t==NULL) {
        return;
    }
    midTravel(t->left);
    printf("%d ",t->data);
    midTravel(t->right);
}

void postTravel(tree *t) {
    if(t==NULL) {
        return;
    }
    postTravel(t->left);
    postTravel(t->right);
    printf("%d ",t->data);
}

main() {
    tree *t;
    int i;
    for(i=0; i<SIZE; i++) {
        t=init(t,i);
    }
    preTravel(t);
    printf("\n");
    midTravel(t);
    printf("\n");
    postTravel(t);
}

猜你喜欢

转载自www.cnblogs.com/wangbin2188/p/9593678.html