二叉查找树的实现

1.二叉查找树的定义

对于树中的每个节点X,它的左子树中所有关键字值小于X的关键字值,而它的右子树中所有关键字值大于X的关键字值。

2.主要实现插入,删除等操作,代码如下:

//
//  SerachTree.h
//  SearchTree
//
//  Created by Mac on 15/11/24.
//  Copyright © 2015年 Mac. All rights reserved.
//

#ifndef SerachTree_h
#define SerachTree_h

#include <stdio.h>
#include <stdlib.h>
#include <string.h>

typedef struct _tagST{
    
    int data;
    struct _tagST* left;
    struct _tagST* right;
    
}SerachTree;


//create a tree with nothing
SerachTree* STCreate();

//insert
SerachTree* STInsert(SerachTree* t,int data);

//delete
SerachTree* STDelete(SerachTree* t,int data);

//find data
SerachTree* STFind(SerachTree* t,int data);

//find min data
SerachTree* STFindMin(SerachTree* t);

//find max data
SerachTree* STFindMax(SerachTree* t);

//destroy a tree
void STDestroy(SerachTree* t);

#endif /* SerachTree_h */

//
//  SerachTree.c
//  SearchTree
//
//  Created by Mac on 15/11/24.
//  Copyright © 2015年 Mac. All rights reserved.
//

#include "SerachTree.h"

static SerachTree* MakeEmpty(SerachTree* t){
    if (t != NULL) {
        MakeEmpty(t->left);
        MakeEmpty(t->right);
        free(t);
        t = NULL;
    }
    
    return NULL;
}


//create a tree with nothing
SerachTree* STCreate(){
    return NULL;
}

//insert
SerachTree* STInsert(SerachTree* t,int data){
    if (t == NULL) {
        t = (SerachTree*)malloc(sizeof(SerachTree));
        if (t == NULL) {
            return NULL;
        }
        t->data = data;
        t->left = t->right = NULL;
    }
    else if (data < t->data){
        t->left = STInsert(t->left, data);
    }
    else if (data > t->data){
        t->right = STInsert(t->right, data);
    }
    
    return t;
}

//del data
SerachTree* STDelete(SerachTree* t,int data){
    if (t == NULL) {
        return NULL;
    }
    SerachTree* tmp = NULL;
    
    if (data < t->data) {
        t->left = STDelete(t->left, data);
    }
    else if (data > t->data){
        t->right = STDelete(t->right, data);
    }
    else{
        if (t->left && t->right) { //hava two children
            //find min data in right child replace this node
            tmp = STFindMin(t);
            t->data = tmp->data;
            t->right = STDelete(t->right, data);  //delete node in right child
        }
        else{  //hava one or zero child
            tmp = t;
            if (t->left == NULL) {
                t = t->right;
            }
            else if (t->right == NULL){
                t = t->left;
            }

            free(tmp);
            tmp = NULL;
        }
    }
    
    return t;
}


//find data
SerachTree* STFind(SerachTree* t,int data){
    if (t == NULL) {
        return NULL;
    }
    if (data < t->data) {
        return STFind(t->left, data);
    }
    else if (data > t->data){
        return STFind(t->right, data);
    }
    else{
        return t;
    }
}

//find min data
SerachTree* STFindMin(SerachTree* t){
    if (t == NULL) {
        return NULL;
    }
    
    if (t->left == NULL) {
        return t;
    }
    else{
        return STFindMin(t->left);
    }
}

//find max data
SerachTree* STFindMax(SerachTree* t){
    if (t == NULL) {
        return NULL;
    }
    SerachTree* tmp = t;
    while (tmp->right != NULL) {
        tmp = tmp->right;
    }
    return tmp;
}


//destroy a tree
void STDestroy(SerachTree* t){
    MakeEmpty(t);
}

//
//  main.c
//  SearchTree
//
//  Created by Mac on 15/11/24.
//  Copyright © 2015年 Mac. All rights reserved.
//

#include <stdio.h>
#include "SerachTree.h"

int main(int argc, const char * argv[]) {
    // insert code here...
    
    SerachTree * t = STCreate();
    
    for (int i = 0; i < 100; i++) {
        t = STInsert(t, i+1);
    }
    
    fprintf(stderr, "dd %d\n",t->data);
    
    SerachTree* f = STFind(t, 26);
    if (f == NULL) {
        fprintf(stderr, "没有找到结点\n");
        return -1;
    }
    fprintf(stderr, "%d\n",f->data);
//    fprintf(stderr, "%d\n",f->left->data);
    fprintf(stderr, "%d\n",f->right->data);
    
    t = STDelete(t, 100);
    t = STDelete(t, 0);
    t = STDelete(t, 3);
    
    SerachTree* minNode = STFindMin(t);
    if (minNode == NULL) {
        return -2;
    }
    fprintf(stderr, "min node = %d\n",minNode->data);
    
    SerachTree* maxNode = STFindMax(t);
    if (maxNode == NULL) {
        return -2;
    }
    fprintf(stderr, "max node = %d\n",maxNode->data);
    
    
    STDestroy(t);
    
    return 0;
}


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值