【c】c语言二叉树的创建、初始化、print

该博客介绍了如何使用C语言创建和打印字符与整型二叉树。通过递归实现从给定的字符或整数序列构建二叉树,并展示了一种自底向上的构建方式。在创建完成后,使用中序遍历展示二叉树的结构。虽然没有涵盖增删改查操作,但提供了参考链表操作的提示。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

0. 环境

ubuntu-1804
GCC-7.5.0


1. 字符二叉树

1. create & print

1.1 源码

#include <stdio.h>
#include <stdlib.h>
#include <string.h>

#define DEBUG

typedef struct node_t{
    struct node_t *left;
    struct node_t *right;
    char val;
}NODE;

typedef struct {
    NODE *node;
    int used;
}RET;

RET create_tree(const char * p , int size){
#ifdef DEBUG
    printf("size = %d\n",size);
#endif
    if (size == 0) {
        return (RET){NULL, 0};
    }
    if (p[0] == '#') {
        return (RET){NULL, 1};
    }
    NODE *node = (NODE *)malloc(sizeof(NODE));
    node->val = p[0];
    RET left  = create_tree(p + 1,              size - 1            );
    RET right = create_tree(p + 1 + left.used,  size - 1 - left.used);
    node->left  = left.node;
    node->right = right.node;
    return (RET){
        node, 1 + left.used + right.used
    };
}

void display_tree(NODE * node){
    if (node == NULL) {
        return ;
    }
    printf("%c ",node->val);
    display_tree(node->left );
    display_tree(node->right);
}


int main(){

    /* 0. data */
    const char * p = "ABD###CE";
    /*
             A
            / \
           B   C
          / \ / 
         D  # E  
        / \
       #   #
    */
    int size = strlen(p);
#ifdef DEBUG
    printf("\n");
    for (int i = 0; i < size; ++i) {
        printf("%c ",*(p+i));
    }
    printf("\n");
#endif

    /* 1. create tree */
    RET ret = create_tree(p , size);
    NODE * root = ret.node;

    /* 2. display */
#ifdef DEBUG
    printf("root->val              = %c\n",root->val                );
    printf("root->left->val        = %c\n",root->left->val          );
    printf("root->right->val       = %c\n",root->right->val         );
    printf("root->left->left->val  = %c\n",root->left->left->val    );
    printf("root->right->left->val = %c\n",root->right->left->val   );
#endif
    display_tree(root);
    printf("\n");

    return  0;
}

1.2 LOG


A B D # # # C E
size = 8
size = 7
size = 6
size = 5
size = 4
size = 3
size = 2
size = 1
size = 0
size = 0
size = 0
root->val              = A
root->left->val        = B
root->right->val       = C
root->left->left->val  = D
root->right->left->val = E
A B D C E

2. 增删改查

略,参考链表即可


2. 整型二叉树

1. create & print

1.1 源码

#include <stdio.h>
#include <stdlib.h>
#include <string.h>

#define DEBUG
#define NULL_NODE (-1)

typedef struct node_t{
    struct node_t *left;
    struct node_t *right;
    int val;
}NODE;

typedef struct {
    NODE *node;
    int used;
}RET;

RET create_tree(const int * p , int size){
#ifdef DEBUG
    printf("size = %d\n",size);
#endif
    if (size == 0) {
        return (RET){NULL, 0};
    }
    if (p[0] == NULL_NODE) {
        return (RET){NULL, 1};
    }
    NODE *node = (NODE *)malloc(sizeof(NODE));
    node->val = p[0];
    RET left  = create_tree(p + 1,              size - 1            );
    RET right = create_tree(p + 1 + left.used,  size - 1 - left.used);
    node->left  = left.node;
    node->right = right.node;
    return (RET){
        node, 1 + left.used + right.used
    };
}

void display_tree(NODE * node){
    if (node == NULL) {
        return ;
    }
    printf("%d ",node->val);
    display_tree(node->left );
    display_tree(node->right);
}


int main(){

    /* 0. data */
    const int arr[] = {1,2,4,NULL_NODE,NULL_NODE,NULL_NODE,3,5};
    /*
             1
            / \
           2   3
          / \ / 
         4  # 5  
        / \
       #   #
    */
    int size = sizeof(arr)/sizeof(arr[0]);
#ifdef DEBUG
    printf("\n");
    for (int i = 0; i < size; ++i){
        printf("%d ", arr[i]);
    }
    printf("\n");
#endif

    /* 1. create tree */
    RET ret = create_tree(arr , size);
    NODE * root = ret.node;

    /* 2. display */
#ifdef DEBUG
    printf("root->val              = %d\n",root->val                );
    printf("root->left->val        = %d\n",root->left->val          );
    printf("root->right->val       = %d\n",root->right->val         );
    printf("root->left->left->val  = %d\n",root->left->left->val    );
    printf("root->right->left->val = %d\n",root->right->left->val   );
#endif
    display_tree(root);
    printf("\n");

    return  0;
}

1.2 LOG

1 2 4 -1 -1 -1 3 5
size = 8
size = 7
size = 6
size = 5
size = 4
size = 3
size = 2
size = 1
size = 0
size = 0
size = 0
root->val              = 1
root->left->val        = 2
root->right->val       = 3
root->left->left->val  = 4
root->right->left->val = 5
1 2 4 3 5

2. 增删改查

略,参考链表即可

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

过得精彩

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值