文章目录
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. 增删改查
略,参考链表即可