【c语言数据结构】二叉树

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

}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值