二叉树的静态实现使用C语言实现

文章介绍了二叉树的静态实现,即使用数组而非指针表示二叉树,强调了其空间利用率高、内存连续性好和操作简便等优点。提供了C语言实现静态二叉树的代码,包括插入节点、四种遍历方法,并在main函数中展示了应用实例。
摘要由CSDN通过智能技术生成

二叉树的静态实现是指使用数组来表示二叉树,而不是使用指针。在二叉树的静态实现中,每个节点都用一个数组元素表示,该数组元素包含了节点的值以及指向该节点左右子树的指针(在数组中表示为下标)。如果一个节点没有左右子树,则用 -1 表示该指针为空。

二叉树的静态实现有以下几个优点:

  • 空间利用率高:使用数组来表示二叉树,不需要为每个节点分配额外的指针空间,因此空间利用率较高。
  • 内存连续性好:使用数组来表示二叉树,所有节点在内存中都是连续存储的,因此可以更好地利用 CPU 缓存,提高程序的运行效率。
  • 操作简便:静态实现的二叉树可以方便地进行序列化和反序列化,对于一些算法问题,序列化后的二叉树可以方便地存储和传输。

以下是使用C语言实现二叉树的静态实现的示例代码:

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

#define MAX_SIZE 100

struct TreeNode {
    int val;
    int left;
    int right;
};

struct TreeNode tree[MAX_SIZE];

// 初始化二叉树
void init() {
    for (int i = 0; i < MAX_SIZE; i++) {
        tree[i].val = 0;
        tree[i].left = -1;
        tree[i].right = -1;
    }
}

// 插入节点
int insert(int val) {
    int i = 0;
    while (tree[i].val != val && i < MAX_SIZE) {
        if (val < tree[i].val) {
            if (tree[i].left == -1) {
                break;
            }
            i = tree[i].left;
        } else {
            if (tree[i].right == -1) {
                break;
            }
            i = tree[i].right;
        }
    }
    if (tree[i].val == val) {
        return -1; // 节点已存在
    }
    if (i == MAX_SIZE) {
        return -2; // 数组已满
    }
    tree[i].val = val;
    tree[i].left = -1;
    tree[i].right = -1;
    return 0;
}

// 前序遍历
void preorder(int i) {
    if (i == -1) {
        return;
    }
    printf("%d ", tree[i].val);
    preorder(tree[i].left);
    preorder(tree[i].right);
}

// 中序遍历
void inorder(int i) {
    if (i == -1) {
        return;
    }
    inorder(tree[i].left);
    printf("%d ", tree[i].val);
    inorder(tree[i].right);
}

// 后序遍历
void postorder(int i) {
    if (i == -1) {
        return;
    }
    postorder(tree[i].left);
    postorder(tree[i].right);
    printf("%d ", tree[i].val);
}

// 层序遍历
void levelorder(int root) {
    int queue[MAX_SIZE];
    int front = 0, rear = 0;
    queue[rear++] = root;
    while (front != rear) {
        int i = queue[front++];
        if (i == -1) {
            continue;
        }
        printf("%d ", tree[i].val);
        queue[rear++] = tree[i].left;
        queue[rear++] = tree[i].right;
    }
}

int main() {
    init();
    insert(5);
    insert(2);
    insert(8);
    insert(1);
    insert(4);
    insert(6);
    insert(9);
    printf("preorder: ");
    preorder(0);
    printf("\n");
    printf("inorder: ");
    inorder(0);
    printf("\n");
    printf("postorder: ");
    postorder(0);
    printf("\n");
    printf("levelorder: ");
    levelorder(0);
    printf("\n");
    return 0;
}

在这个示例代码中,我们定义了一个 MAX_SIZE 常量来限制二叉树的最大节点数。在 init 函数中,我们初始化了整个数组,并将每个节点的左右子树下标设置为 -1。

insert 函数中,我们按照二叉搜索树的规则,将新节点插入到合适的位置。如果节点已经存在,则返回 -1;如果数组已满,则返回 -2。在遍历函数中,我们使用递归方式实现了前序遍历、中序遍历和后序遍历,使用队列实现了层序遍历。值得注意的是,层序遍历使用了一个队列,而不是递归方式,因为递归方式不适合层序遍历。

main 函数中,我们演示了如何创建二叉搜索树,并使用各种遍历方法遍历树。

这是二叉树的静态实现的一个简单示例,实际应用中可能需要根据具体需求进行调整和扩展。

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值