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);
}

 

转载于:https://www.cnblogs.com/wangbin2188/p/9593678.html

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值