c语言数据结构完全二叉树
快速开始
直接参考示例代码即可
介绍
概念
二叉树(Binary tree)是树形结构的一个重要类型。
许多实际问题抽象出来的数据结构往往是二叉树形式,即使是一般的树也能简单地转换为二叉树,
二叉树的存储结构及其算法都较为简单。
二叉树特点是每个结点最多只能有两棵子树,且有左右之分。
类型
基本类型 | 描述 |
---|---|
空二叉树 | (NULL) |
二叉树根 | 只有一个节点的二叉树 |
左树 | 每个结点只有左子节点的树(链表) |
右树 | 每个节点只有右子节点的树 |
完全二叉树 | 每个深度都是满节点的二叉树 |
示例代码:建立二叉树
介绍
-
该示例代码介绍了一个完全二叉树的建立,以及前序遍历,中序遍历和后序遍历的索引结果。(源代码完成了命名自注释,不再赘述)
-
头文件建立了一个DH_ibtree的二叉树类型,核心数据是data,核心接口是data_info
代码结构
代码结构:
- ./
|
-- DH_btree.h
-- DH_basic_btree.c
DH_btree.h
/*
* copyright DH.
*/
#ifndef DH_BTREE
#define DH_BTREE
/* 标识,说明该参数是入参还是出参 */
#define IN
#define OUT
#define INOUT
/* 数据结构为整型的基本二叉树示例 */
typedef struct _DH_ibtree {
int data;
int deep;
void (*data_info)(int data);
struct _DH_ibtree *left;
struct _DH_ibtree *right;
} DH_ibtree;
#endif
DH_basic_btree.c
#include <stdio.h>
#include <stdlib.h>
#include "DH_btree.h"
static void logDataInfo(int data)
{
printf("[当前节点信息] 节点数据 = %d\n", data);
}
/* 利用前序遍历完成二叉树构建 */
static void preOrderSetUp(IN int *tree_arr,
IN int arr_len,
INOUT DH_ibtree *father_node,
IN int father_node_index)
{
if (father_node == NULL) {
return;
}
if (father_node_index > arr_len) {
return;
}
if (father_node_index * 2 > arr_len) {
return;
}
father_node->left = (DH_ibtree *)calloc(1, sizeof(DH_ibtree));
father_node->left->data = tree_arr[father_node_index * 2 -1];
father_node->left->data_info = logDataInfo;
// printf("%d\n", tree_arr[father_node_index * 2 -1]);
preOrderSetUp(tree_arr, arr_len, father_node->left, father_node_index * 2);
father_node->right = (DH_ibtree *)calloc(1, sizeof(DH_ibtree));
father_node->right->data = tree_arr[father_node_index * 2];
father_node->right->data_info = logDataInfo;
// printf("%d\n", tree_arr[father_node_index * 2]);
preOrderSetUp(tree_arr, arr_len, father_node->right, father_node_index * 2 + 1);
}
/*
* 功能:前序遍历初始化一个二叉树
* 输入:原始二叉树数组,二叉树数组大小
* 输出:无
* 返回:初始化的二叉树
*/
DH_ibtree *DH_ibtree_init(IN int *tree_arr, IN int arr_len)
{
DH_ibtree *new_tree = (DH_ibtree *)calloc(1, sizeof(DH_ibtree));
new_tree->data = tree_arr[0];
new_tree->data_info = logDataInfo;
preOrderSetUp(tree_arr, arr_len, new_tree, 1);
return new_tree;
}
/*
* 功能:二叉树前序遍历
*
*
*
*/
void DH_ibtree_preOrderLoop(IN DH_ibtree *node)
{
if (!node) {
return;
}
node->data_info(node->data);
DH_ibtree_preOrderLoop(node->left);
DH_ibtree_preOrderLoop(node->right);
}
/*
* 功能:二叉树中序遍历
*
*
*
*/
void DH_ibtree_inOrderLoop(IN DH_ibtree *node)
{
if (!node) {
return;
}
DH_ibtree_inOrderLoop(node->left);
node->data_info(node->data);
DH_ibtree_inOrderLoop(node->right);
}
/*
* 功能:二叉树后序遍历
*
*
*
*/
void DH_ibtree_postOrderLoop(IN DH_ibtree *node)
{
if (!node) {
return;
}
DH_ibtree_postOrderLoop(node->left);
DH_ibtree_postOrderLoop(node->right);
node->data_info(node->data);
}
int main(void)
{
int arr[7] = {1, 2, 3, 4, 5, 6, 7};
int arr_num = 7;
DH_ibtree *tree = DH_ibtree_init(arr, arr_num);
printf("preOrderLoop start\n");
DH_ibtree_preOrderLoop(tree);
printf("inOrderLoop start\n");
DH_ibtree_inOrderLoop(tree);
printf("postOrderLoop start\n");
DH_ibtree_postOrderLoop(tree);
}