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

#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###

运行结果:
运行结果

如果错误欢迎指正!~

  • 3
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
链式二叉树的基本操作包括创建、遍历、插入、删除等。 下面是C语言实现链式二叉树的基本操作示例代码: ```c #include <stdio.h> #include <stdlib.h> // 定义二叉树结构体 typedef struct TreeNode{ int data; struct TreeNode *left; struct TreeNode *right; }TreeNode, *Tree; // 创建二叉树 void createTree(Tree *t){ int data; scanf("%d", &data); if(data == -1){ // 输入-1表示该节点为空 *t = NULL; }else{ *t = (Tree)malloc(sizeof(TreeNode)); (*t)->data = data; createTree(&((*t)->left)); // 递归创建左子树 createTree(&((*t)->right)); // 递归创建右子树 } } // 先序遍历 void preOrder(Tree t){ if(t != NULL){ printf("%d ", t->data); preOrder(t->left); preOrder(t->right); } } // 中序遍历 void inOrder(Tree t){ if(t != NULL){ inOrder(t->left); printf("%d ", t->data); inOrder(t->right); } } // 后序遍历 void postOrder(Tree t){ if(t != NULL){ postOrder(t->left); postOrder(t->right); printf("%d ", t->data); } } // 插入节点 void insert(Tree t, int data){ if(t == NULL){ t = (Tree)malloc(sizeof(TreeNode)); t->data = data; t->left = NULL; t->right = NULL; }else{ if(data < t->data){ insert(t->left, data); }else{ insert(t->right, data); } } } // 查找节点 Tree search(Tree t, int data){ if(t == NULL){ return NULL; }else{ if(data == t->data){ return t; }else if(data < t->data){ return search(t->left, data); }else{ return search(t->right, data); } } } // 删除节点 Tree delete(Tree t, int data){ Tree p = t, q = NULL; while(p != NULL && p->data != data){ q = p; if(data < p->data){ p = p->left; }else{ p = p->right; } } if(p == NULL){ // 没有找到要删除的节点 return t; } if(p->left == NULL){ // 要删除的节点没有左子树 if(q == NULL){ // 要删除的节点是根节点 t = p->right; }else if(p == q->left){ // 要删除的节点是其父节点的左子节点 q->left = p->right; }else{ // 要删除的节点是其父节点的右子节点 q->right = p->right; } free(p); }else if(p->right == NULL){ // 要删除的节点没有右子树 if(q == NULL){ // 要删除的节点是根节点 t = p->left; }else if(p == q->left){ // 要删除的节点是其父节点的左子节点 q->left = p->left; }else{ // 要删除的节点是其父节点的右子节点 q->right = p->left; } free(p); }else{ // 要删除的节点有左右子树 Tree s = p->left, r = p; while(s->right != NULL){ r = s; s = s->right; } p->data = s->data; if(r == p){ // 要删除的节点的左子树没有右子树 r->left = s->left; }else{ // 要删除的节点的左子树有右子树 r->right = s->left; } free(s); } return t; } int main(){ Tree t = NULL; createTree(&t); // 创建二叉树 printf("先序遍历:"); preOrder(t); // 先序遍历 printf("\n中序遍历:"); inOrder(t); // 中序遍历 printf("\n后序遍历:"); postOrder(t); // 后序遍历 printf("\n"); int data; printf("请输入要插入的节点值:"); scanf("%d", &data); insert(t, data); // 插入节点 printf("中序遍历:"); inOrder(t); // 中序遍历 printf("\n请输入要查找的节点值:"); scanf("%d", &data); Tree node = search(t, data); // 查找节点 if(node != NULL){ printf("找到了节点:%d\n", node->data); }else{ printf("没有找到节点:%d\n", data); } printf("请输入要删除的节点值:"); scanf("%d", &data); t = delete(t, data); // 删除节点 printf("中序遍历:"); inOrder(t); // 中序遍历 return 0; } ``` 以上代码实现了创建二叉树、先序遍历、中序遍历、后序遍历、插入节点、查找节点、删除节点等操作
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值