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);}