C语言数据结构-用数组实现二叉树(前、中、后序)

数组实现二叉树及遍历

一、前言

        二叉树是数据结构中的核心概念,其“左小右大”的特性使其在查找、插入、删除操作中具有高效性能。本文将通过数组(顺序存储) 实现二叉树的构建,并配套实现前序、中序、后序三种递归遍历方式,代码简洁易懂。

二、核心思路

1. 数组存储二叉树的优势

无需额外定义节点结构体,通过数组下标直接映射节点关系:

       · 根节点存于下标 1(避免下标0导致子节点计算冲突)

      · 若节点下标为  index ,则左子下标为  index*2 ,右子下标为  index*2+1

       · 初始化简单,用 0 表示空节点,直观易理解

2. 二叉树构建规则

 · 以数组第一个元素作为根节点

 · 后续元素按“左小右大”原则插入:

         · 新节点值 < 当前节点值 → 插入左子树

         · 新节点值 ≥ 当前节点值 → 插入右子树

         · 通过循环从根节点开始查找空位置,找到后完成插入

3. 三种遍历逻辑

        · 前序遍历:根 → 左子树 → 右子树

        · 中序遍历:左子树 → 根 → 右子树

        · 后序遍历:左子树 → 右子树 → 根

三、完整代码实现

        1. 头文件与定义

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

#define MAX_SIZE 100  // 二叉树数组最大容量(可根据需要调整)

        2. 遍历函数

        · 前序遍历

// 前序遍历(根、左、右)
void preOrder(int mybtree[], int index, int maxIndex) {
    if (index > maxIndex || mybtree[index] == 0) {
        return;
    }
    printf("%d ", mybtree[index]);  // 访问根
    preOrder(mybtree, index*2, maxIndex);  // 遍历左子树
    preOrder(mybtree, index*2+1, maxIndex);  // 遍历右子树
}

        · 中序遍历

// 中序遍历(左、根、右)
void inOrder(int mybtree[], int index, int maxIndex) {
    if (index > maxIndex || mybtree[index] == 0) {
        return;
    }
    inOrder(mybtree, index*2, maxIndex);  // 遍历左子树
    printf("%d ", mybtree[index]);  // 访问根
    inOrder(mybtree, index*2+1, maxIndex);  // 遍历右子树
}

        · 后序遍历

// 后序遍历(左、右、根)
void postOrder(int mybtree[], int index, int maxIndex) {
    if (index > maxIndex || mybtree[index] == 0) {
        return;
    }
    postOrder(mybtree, index*2, maxIndex);  // 遍历左子树
    postOrder(mybtree, index*2+1, maxIndex);  // 遍历右子树
    printf("%d ", mybtree[index]);  // 访问根
}

3. 主函数main入口

int main() {
    int nodelist[] = {6, 3, 8, 5, 2, 9, 4, 7};
    //动态计算节点数:数组总结点数 / 单个元素字节数
    int len = sizeof(nodelist) / sizeof(nodelist[0]);    // nodelist[0]——代表单个元素的字节大小
    //初始化二叉树组:用0填充(0代表“空节点”)
    int mybtree[MAX_SIZE] = {0};
    int index, i;   //index——记录当前插入位置,i——循环变量

    // 构建二叉搜索树
    mybtree[1] = nodelist[0];    //根节点存在下标1
    for (i = 1; i < len; i++) {
        //每次插入新节点,都从根节点(下标1)开始找位置
        index = 1;
        while (mybtree[index] != 0) {
            if (mybtree[index] > nodelist[i]) {
                index *= 2;
            } else {
                index = index*2 + 1;
            }
        }
        mybtree[index] = nodelist[i];
    }

    // 遍历结果
    printf("\n前序遍历:");
    preOrder(mybtree, 1, 10);   //从根节点(下标1)开始,遍历到下标10
    printf("\n中序遍历:");
    inOrder(mybtree, 1, 10);  
    printf("\n后序遍历:");
    postOrder(mybtree, 1, 10);
    printf("\n");

    return 0;
}

四、运行结果

五、结语

        本文通过数组实现了二叉搜索树的构建与遍历,代码简洁易懂,适合入门学习。数组存储的优势在于实现简单、节点关系直观,缺点是空间利用率较低,适用于节点数量较少的场景。若需处理大量数据,可进一步学习链式存储实现方式,详见:C语言数据结构-用链表的方式构建和遍历二叉树(前、中、后序)-优快云博客

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值