LinuxC/C++编程基础(5) 排序二叉树的实现

本文介绍如何在Linux环境下使用C/C++编程实现排序二叉树,包括binary_search_tree.h头文件的声明,binary_search_tree.cpp的具体实现以及main.cpp的应用示例。

一.binary_search_tree.h头文件的声明,如下:

#ifndef BINARY_SEARCH_TREE_H

#define BINARY_SEARCH_TREE_H

typedef struct TreeNode* link;
struct TreeNode{
    unsigned char item;
    link left;
    link right;
};
link search(link t, int key);
link insert(link t, int key);
link deleteNode(link t, int key);
void printTree(link t);

#endif


二.binary_search_tree.cpp的实现,如下:

#include <stdlib.h>
#include <stdio.h>
#include "binary_search_tree.h"

static link createNode(unsigned char item){
    link p = (link)malloc(sizeof(*p));
    p->item = item;
    p->left = NULL;
    p->right = NULL;
    return p;
}

static void releaseNode(link p){
    free(p);
}

link search(link t, int key){
    if(t == NULL){
        return NULL;
    }
    if(t->item > key){
        return search(t->left, key);
    }
    if(t->item < key){
        return search(t->right, key);
    }
    return t;
}

link insert(link t, int key){
    if(t == NULL){
        return createNode(key);
    }
    if(t->item > key){
        t->left = insert(t->left, key);
    }else{
        t->right = insert(t->right, key);
    }
    return t;
}

link deleteNode(link t, int key){
    link p;
    if(t == NULL){
        return NULL;
    }
    if(t->item > key){
        t->left = deleteNode(t->left, key);
    }else if(t->item < key){
        t->right = deleteNode(t->right, key);
    }else{
        if(t->left == NULL && t->right == NULL){
            releaseNode(t);
            t = NULL;
        }else if(t->left != NULL){
            for(p=t->left;p->right != NULL;p=p->right);
            t->item = p->item;
            t->left = deleteNode(t->left, t->item);
        }else if(t->right != NULL){
            for(p=t->right;p->left != NULL;p=p->left);
            t->item = p->item;
            t->right = deleteNode(t->right, t->item);
        }
    }
    return t;
}

void printTree(link t){
    if(t != NULL){
        printf("(");
        printf("%d", t->item);
        printTree(t->left);
        printTree(t->right);
        printf(")");
    }else{
        printf("()");
    }
}


三.main.cpp的实现,如下:

#include <stdio.h>
#include <stdlib.h>
#include <time.h>
#include "binary_search_tree.h"
#define RANGE 100
#define N 6
void printItem(link p){
    printf("%d", p->item);
}
int main(int argc, char** argv){
    int i = 0;
    int key = 0;
    link root = NULL;
    srand(time(NULL));
    for(i=0;i<N;++i){
        root = insert(root, rand() % RANGE);
    }
    printf("\t\\tree");
    printTree(root);
    printf("\n\n");
    while(root){
        key = rand() % RANGE;
        if(search(root, key)){
            printf("delete %d in tree\n", key);
            root = deleteNode(root, key);
            printf("\t\\tree");
            printTree(root);
            printf("\n\n");
        }
    }
    return 0;

}


说明:代码简单明了,无需赘述。


参考文献:宋劲彬,linux c编程一站式学习

转载请注明出处:山水间博客,http://blog.csdn.net/linyanwen99/article/details/8211722


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值