链式二叉树的实现以及常用操作(C语言) 超详细!

本文详细介绍了如何使用C语言实现链式二叉树,并涵盖了其常见操作。通过实例展示了运行结果,期待读者指正可能存在的错误。
摘要由CSDN通过智能技术生成
#include<stdio.h>
#include <stdlib.h>

typedef struct bin_node//结点
{
    char data;//数据域
    struct bin_node* right;//右子树
    struct bin_node* left;//左子树
}node;//取小名

int cur;//现在指向的结点
char str[1000];//数组存放遍历字符串

node* create_tree()//创建树
{
    cur++;//指向下一个
    if(str[cur] == '#')//如果碰到#,则表示该子树是空结点
    {
        return NULL;
    }
    node* root = (node*)malloc(sizeof(node));//不是空结点的话,给结点分配空间
    root -> data = str[cur];//数据域赋值
    root -> left = create_tree();//递归 左子树相同方法创建树
    root -> right = create_tree();//递归 右子树相同方法创建树
    return root;
}

void preorder_ergodic(node* cur_node)//前序遍历树 传入该结点的地址
{
    if(cur_node == NULL)//结点地址为空 没有结点了 返回
        return ;

    printf ( "%c ", cur_node -> data );//否则 有结点 输出结点数据
    preorder_ergodic(cur_node -> left);//递归 左子树相同方法前序遍历树
    preorder_ergodic(cur_node -> right);//递归 右子树相同方法前序遍历树
}

void midorder_ergodic(node* cur_node)//中序遍历树
{
    if(cur_node == NULL)
        return ;

    midorder_ergodic(cur_node -> left);
    printf("%c ", cur_node -> data);
    midorder_ergodic(cur_node -> right);
}

void lateorder_ergodic(node* cur_node)//后序遍历树
{
    if(cur_node == NULL)
        return ;

    lateorder_ergodic(cur_node -> left);
    lateorder_ergodic(cur_node -> right);
    printf("%c ", cur_node -> data);
}

int len_tree(node* tree)//求树的深度或者叫树的高度 传入树的地址/根节点的地址
{
    if(tree == NULL)//树是空的 返回0
        return 0;

    int lnum = len_tree(tree->left);//递归 求左子树的深度
    int rnum = len_tree(tree->right);//递归 求右子树的深度

    if(lnum >= rnum)//如果左子树深度更大
        return lnum + 1;//返回左子树的深度加上这一层
    else//如果右子树深度更大
        return rnum + 1;//返回右子树的深度加上这一层
}

int num_node(node* tree)//求树的结点数n
{
    if(tree == NULL)//如果是空树
        return 0;//返回结点数0
    return (num_node(tree->left) + num_node(tree->right) + 1);//否则返回左子树结点数+右子树结点数+自身1
}

int num_zero_node(node* tree)//求树的叶子结点/度为0的数目n0
{
    if(tree == NULL)//如果是空树
        return 0;//返回叶子结点数0
    if(tree->left == NULL && tree->right == NULL)//如果左右子树都是空的
        return 1;//返回叶子结点数1
    else//如果有子树
        return(num_zero_node(tree->left) + num_zero_node(tree->right));//返回左子树和右子树上的叶子结点数
}

int num_one_node(node* tree)//求度为1的结点数n1
{
    if(tree == NULL)//如果该结点是空的
        return 0;//返回度为1的结点数0

    //如果该结点度为1
    if((tree->left == NULL && tree->right != NULL) || (tree->left != NULL && tree->right == NULL))
        return (1 + num_one_node(tree->left) + num_one_node(tree->right));//返回1+左子树度为1的结点数+右子树度为1的结点数

    return(num_one_node(tree->left) + num_one_node(tree->right));//如果左右子树都是空或都有子树,则返回他们左右子树度为1的结点数
}

int num_two_node(node* tree)//求度为2的结点数n2
{
    if(tree == NULL)//如果该结点是空的
        return 0;//返回度为2的结点数0

    //如果该结点度为2
    if(tree->left != NULL && tree->right != NULL)
        return (1 + num_two_node(tree->left) + num_two_node(tree->right));//返回1+左子树度为2的结点数+右子树度为2的结点数

    return(num_two_node(tree->left) + num_two_node(tree->right));//如果左右子树都为空/一空一不空,则返回他们左右子树度为2的结点数

}

int main()
{
    char t;
    int start = 0;
    while(1)
    {
        scanf("%c", &t);
        if(t == '\n')
            break;
        str[start] = t;
        start++;
    }
    cur = -1;
    node* tree = create_tree();

    printf("pre_oder:");
    preorder_ergodic(tree);
    puts("");

    printf("mis_oder:");
    midorder_ergodic(tree);
    puts("");

    printf("late_oder:");
    lateorder_ergodic(tree);
    puts("");

    printf("the degree of depth is:%d.\n", len_tree(tree));

    printf("the number of the nodes is:%d.\n", num_node(tree));

    printf("the number of the zero_nodes is:%d.\n", num_zero_node(tree));

    printf("the number of the one_nodes is:%d.\n", num_one_node(tree));

    printf("the number of the two_nodes is:%d.\n", num_two_node(tree));


    return 0;
}

//示例:abc##de#g##f###

运行结果:
运行结果

如果错误欢迎指正!~

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值