二叉树的二叉链表表示与实现

二叉树的特点是每个结点至多只有两棵子树,且二叉树有左右字子树之分,次序不能任意颠倒。二叉树的存储结构可以用顺序存储和链式存储来存储。二叉树一般使用链式存储结构,由二叉树的定义可知,二叉树的结点由一个数据元素和分别指向其左右孩子的指针构成,即二叉树的链表结点中包含3个域,这种结点结构的二叉树存储结构称之为二叉链表。

typedef struct tnode {  
    elemtype        data;  
    struct tnode        *lchild;  
    struct tnode        *rchild;  
}*bitree, bitnode;  

创建一棵二叉树

int create_bitree(bitree *bt)  
{  
    elemtype    data;  
    scanf("%d", &data);  
    if (0 == data) {  
        *bt = NULL;  
    } else {  
        *bt = (bitree)malloc(sizeof(bitnode));  
        if (!(*bt))  
            exit(OVERFLOW);  
        (*bt)->data = data;  
        create_bitree(&(*bt)->lchild);  
        create_bitree(&(*bt)->rchild);  
    }  
    return OK;  
}  

二叉树的遍历

//先序
void preorder(bitree bt, int (*visit)(elemtype e))  
{  
    if (bt) {  
        visit(bt->data);  
        preorder(bt->lchild, visit);  
        preorder(bt->rchild, visit);  
    }  
}  
//中序
void inorder(bitree bt, int (*visit)(elemtype e))  
{  
    if (bt) {  
        inorder(bt->lchild, visit);  
        visit(bt->data);  
        inorder(bt->rchild, visit);  
    }  
}  
//后序
void postorder(bitree bt, int (*visit)(elemtype e))  
{  
    if (bt) {  
        postorder(bt->lchild, visit);  
        postorder(bt->rchild, visit);  
        visit(bt->data);  
    }  
}  

二叉树的深度

int get_tree_depth(bitree bt)  
{  
    int ldepth, rdepth;  

    if (!bt)  
        return 0;  
    else if (!bt->lchild && !bt->rchild)  
        return 1;  
    else {  
        ldepth = get_tree_depth(bt->lchild);  
        rdepth = get_tree_depth(bt->rchild);  

        return (ldepth > rdepth ? ldepth : rdepth) + 1;  
    }  
}  

叶子结点数

int get_num_of_leave(bitree bt)  
{  
    if (!bt)  
        return 0;  
    else if (!bt->lchild && !bt->rchild)  
        return 1;  
    else  
        return (get_num_of_leave(bt->lchild) + get_num_of_leave(bt->rchild));  
}  

释放二叉树

void free_bitree(bitree *bt)  
{  
    if (*bt) {  
        if ((*bt)->lchild)  
            free_bitree(&(*bt)->lchild);  
        if ((*bt)->rchild)  
            free_bitree(&(*bt)->rchild);  
            free(*bt);  
            *bt = NULL;  
    }  
}  
  • 0
    点赞
  • 6
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值