Linux学习之路(11)

二叉树:

BTREE.h:

#ifndef _BTREE_H_
#define _BTREE_H_

typedef char BTreeData;

typedef enum {FALSE, TRUE} BOOL;
typedef enum {LEFT, RIGHT} MOUNTWAY;

typedef struct btreeNode                        //二叉树节点结构体
{
    BTreeData data;
    struct btreeNode* lchild;
    struct btreeNode* rchild;
}BTreeNode;

typedef struct btree                            //二叉树结构体
{
    BTreeNode* root;
}BTree;

BTree* BTreeCreate();

typedef void (*PFUNC)(BTreeNode* node, int level);

BOOL BTreeInsert(BTree* btree, BTreeData data, int path, int steps, MOUNTWAY mw);

void BTree_Display(BTree *btree,PFUNC callback);


int BTreeCount(BTree* btree);                //节点数

int BTreeHeigth(BTree* btree);              //高度

int BTreeDegree(BTree* btree);              // 度


#endif  //_BTREE_H_

 

 

main.c:

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

void myprintf(BTreeNode *node, int level)
{
    int i;
    for(i = 1; i < level; i++)
    {
        printf("----");
    }
    
    if(node != NULL)
        printf("%c\n", node->data);
    else
        printf("\n");
}

int main1()
{
    BTree* btree = BTreeCreate();
    if (NULL == btree)
        return -1;
    
    printf("二叉树创建成功\n");
    
    BTreeInsert(btree, 'A', 0, 0, LEFT);
    BTreeInsert(btree, 'B', 0, 1, LEFT);
    BTreeInsert(btree, 'C', 1, 1, LEFT);
    BTreeInsert(btree, 'D', 0, 2, LEFT);
    BTreeInsert(btree, 'E', 2, 2, LEFT);
    BTreeInsert(btree, 'F', 1, 2, LEFT);
    BTreeInsert(btree, 'G', 3, 2, LEFT);

    BTree_Display(btree, myprintf);
    printf("树的节点数为:%d\n",BTreeCount(btree));
    printf("树的高度为:%d\n",BTreeHeight(btree));
    printf("树的度为:%d\n",BTreeDegree(btree));    
    printf("***********************************************\n");
    
    
    BTreeDelete(btree, 1, 1);
    BTree_Display(btree, myprintf);    
    
    printf("树的节点数为:%d\n",BTreeCount(btree));
    printf("树的高度为:%d\n",BTreeHeight(btree));
    printf("树的度为:%d\n",BTreeDegree(btree));
    return 0;
}

void pre_order(BTreeNode* node)
{
    if(NULL == node)
        return;
    //根
    printf("%4c", node->data);
    //左
    pre_order(node->lchild);
    //右
    pre_order(node->rchild);
}

void mid_order(BTreeNode* node)
{
    if(NULL == node)
        return;
    
    //左
    mid_order(node->lchild);
    //根
    printf("%4c", node->data);
    //右
    mid_order(node->rchild);
}

void last_order(BTreeNode* node)
{
    if(NULL == node)
        return;

    //左
    last_order(node->lchild);
    //右
    last_order(node->rchild);
        //根
    printf("%4c", node->data);
}
        

int main()
{
    BTree* btree = BTreeCreate();
    if (NULL == btree)
        return -1;
    
    printf("二叉树创建成功\n");
    
    BTreeInsert(btree, 'A', 0, 0, LEFT);
    BTreeInsert(btree, 'B', 0, 1, LEFT);
    BTreeInsert(btree, 'C', 1, 1, LEFT);
    BTreeInsert(btree, 'D', 0, 2, LEFT);
    BTreeInsert(btree, 'E', 2, 2, LEFT);
    BTreeInsert(btree, 'F', 1, 2, LEFT);
    BTreeInsert(btree, 'G', 3, 2, LEFT);

    BTree_Display(btree, myprintf);
    //前序遍历
    pre_order(btree->root);
    printf("\n");
    //中序遍历
    mid_order(btree->root);
    printf("\n");
    //后序遍历
    last_order(btree->root);
    printf("\n");


    return 0;
}
    

BTree.c:

#include "BTREE.h"
#include <stdlib.h>

BTree* BTreeCreate()
{
    BTree* btree = (BTree*)malloc(sizeof(BTree)/sizeof(char));
    
    if (NULL == btree)
        return NULL;
    
    btree->root = NULL;
    return btree;
}
    
//插入节点
BOOL BTreeInsert(BTree* btree, BTreeData data, int path, int steps, MOUNTWAY mw)
{
    BTreeNode* node = (BTreeNode*)malloc(sizeof(BTreeNode)/sizeof(char));                    //创建节点
    
    if (NULL == node)    //判断节点是否创建成功
        return FALSE;
    
    //节点初始化
    node->data = data;
    node->lchild = NULL;                                
    node->rchild = NULL;
    
    BTreeNode* parent = NULL;    //父节点
    BTreeNode* tmp = btree->root;    //根节点开始
    
    int way;
    
    while(steps>0 && tmp != NULL)
    {
        way = path&1;
        path >>= 1;
        
        parent = tmp;
        
        if(way == LEFT)
        {
            tmp = tmp->lchild;
        }
        else
        {
            tmp = tmp->rchild;
        }
        steps--;
    }
    
    if(parent != NULL)
    {
        if(way == LEFT)
        {
            parent->lchild = node;
        }
        else
        {
            parent->rchild = node;
        }
    }
    else
    {
        btree->root = node;
    }
    return TRUE;
}
    
//打印二叉树
void r_display(BTreeNode* node, PFUNC callback, int level)
{
    callback(node, level);  //1、打印自己
    
    if(NULL == node)
    {
        return;
    }
    
    if(node->lchild != NULL || node->rchild != NULL)
    {
        r_display(node->lchild, callback, level+1);
        
        r_display(node->rchild, callback, level+1);
    }
}

void BTree_Display(BTree *btree,PFUNC callback)
{
    if (NULL == btree)
        return;
    
    r_display(btree->root, callback, 1);
}

void r_delete(BTreeNode* node)
{
    if(NULL == node)
        return;
    
    r_delete(node->lchild);        //删左子节点
    r_delete(node->rchild);        //删右子节点
    free(node);                    //删自己
}

void BTreeDelete(BTree* btree, int path, int steps)
{    
    BTreeNode* parent = NULL;    //父节点
    BTreeNode* tmp = btree->root;    //根节点开始
    
    int way;
    
    while(steps>0 && tmp != NULL)
    {
        way = path&1;
        path >>= 1;
        
        parent = tmp;
        
        if(way == LEFT)
        {
            tmp = tmp->lchild;
        }
        else
        {
            tmp = tmp->rchild;
        }
        steps--;
    }
    
    if (NULL != parent)
    {
        if(way == LEFT)
        {
            parent->lchild = NULL;
        }
        else
        {
            parent->rchild = NULL;
        }
    }
    else
    {
        btree->root = NULL;
    }
    
    r_delete(tmp);
}

int r_count(BTreeNode* node)
{
    if (NULL == node)
        return 0;
    
    int lc = r_count(node->lchild);
    int lr = r_count(node->rchild);
    
    return lc+lr+1;
}

int BTreeCount(BTree* btree)      //节点数
{
    if(NULL == btree)
        return 0;
    
    return r_count(btree->root);
}

int r_heigth(BTreeNode* node)
{
    if(NULL == node)
        return 0;
    
    int hc = r_heigth(node->lchild);
    int hr = r_heigth(node->rchild);
    
    return hc>hr?hc+1:hr+1;
}
int BTreeHeight(BTree* btree)    //树高度
{
    if(NULL == btree)
        return 0;
    
    return r_heigth(btree->root);
}

int r_degree(BTreeNode* node)    
{
    if(NULL == node)
        return 0;
    
    int degree = 0;
    
    if(NULL != node->lchild)
        degree++;
    
    if(NULL != node->rchild)
        degree++;
    
    if(degree == 1)
    {
        if((2 == r_degree(node->lchild)) || (2 == r_degree(node->rchild)))
        degree = 2;
    }
    return degree;
}
    
int BTreeDegree(BTree* btree)            //树度
{
    if(NULL == btree)
        return 0;
    
    return r_degree(btree->root);
}

    

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值