设为首页 加入收藏

TOP

二叉树的实现与分析(源码及解析)(一)
2018-01-17 13:05:25 】 浏览:310
Tags:实现 分析 源码 解析

回顾一下,二叉树的结点由一个数据成员和两个指向其子结点的指针组成。


结构体BiTreeNode代表二叉树中的一个单独的结点,这个结构体由上述的3个成员组成。


结构体BiTree代表二叉树这种数据结构。这个结构体包含4个成员:size表示树中的结点的个数,compare成员在二叉树中暂时不会用到,而是等到其他数据类型继承二叉树时才会派上用场。destroy作为参数传递给bitree_init函数。最后,root是一个指向结点层次体系中最高点的指针,也就是指向根结点的指针。


示例1:二叉树抽象数据类型的头文件


/*bitree.h*/
#ifndef BITREE_H
#define BITREE_H
#include <stdlib.h>


/*定义二叉树结点结构体*/
typedef struct BiTreeNode_
{
    void *data;
    struct BiTreeNode_ *left;
    struct BiTreeNode_ *right;
}BiTreeNode;


/*定义二叉树结构体*/
typedef struct BiTree_
{
    int size;
    int (*compare)(const void *key1,const void *key2);
    void (*destroy)(void *data);
    BiTreeNode *root;
}BiTree;


/*公共接口部分*/
void bitree_init(BiTree *tree,void (*destroy)(void *data));
void bitree_destroy(BiTree *tree);
int bitree_ins_left(BiTree *tree,BiTreeNode *node,const void *data);
int bitree_ins_right(BiTree *tree,BiTreeNode *node,const void *data);
void bitree_rem_left(BiTree *tree,BiTreeNode *node);
void bitree_rem_right(BiTree *tree,BiTreeNode *node);
int bitree_merge(BiTree *merge,BiTree *left,BiTree *right,const void *data);


#define bitree_size(tree)((tree)->size)
#define bitree_root(tree)((tree)->root)
#define bitree_is_eob(node)((node) == NULL)
#define bitree_is_leaf(node)((node)->left == NULL && (node)->right == NULL)
#define bitree_data(node)((node)->data)
#define bitree_left(node)((node)->left)
#define bitree_right(node)((node)->right)


#endif // BITREE_H


示例2:二叉树抽象数据类型的实现


#include <stdlib.h>
#include <string.h>
#include "bitree.h"


/*bitree_init  初始化二叉树*/
void bitree_init(BiTree *tree,void (*destroy)(void *data))
{
    tree->size = 0;
    tree->destroy = destroy;
    tree->root = NULL;
   
    return ;
}


/*bitree_destroy  销毁二叉树*/
void bitree_destroy(BiTree *tree)
{
    /*移除树中的所有结点*/
    bitree_rem_left(tree,NULL);
    /*不再允许其他操作,清除树结构*/
    memset(tree,0,sizeof(BiTree));
    return ;
}


/*bitree_ins_left  插入左子结点*/
int bitree_ins_left(BiTree *tree,BiTreeNode *node,const void *data)
{
    BiTreeNode *new_node,**position;
   
    /*决定在何处插入结点*/
    if(node == NULL)
    {
        /*允许只在空树中插入根结点*/
        if(bitree_size(tree)>0)
            return -1;
       
        position = &tree->root;
    }
    else
    {
        /*通常只允许在一个分支的末端进行插入*/
        if(bitree_left(node) != NULL)
            return -1;
       
        position = &node->left;
    }
    /*为结点分配空间*/
    if((new_node = (BiTreeNode*)malloc(sizeof(BiTreeNode)))==NULL)
        return -1;
   
    new_node->data = (void*)data;
    new_node->left = NULL;
    new_node->right = NULL;
    *position = new_node;
   
    tree->size++;
   
    return 0;
}


/*bitree_ins_right  插入右结点*/
int bitree_ins

首页 上一页 1 2 3 下一页 尾页 1/3/3
】【打印繁体】【投稿】【收藏】 【推荐】【举报】【评论】 【关闭】 【返回顶部
上一篇二叉树的实现与分析(源码及解析) 下一篇二叉树的概念、算法简介及树的平衡

最新文章

热门文章

Hot 文章

Python

C 语言

C++基础

大数据基础

linux编程基础

C/C++面试题目