树的顺序表示和遍历

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

// 定义树节点结构体
typedef struct TreeNode {
    float data;    // 节点数据
    bool isEmpty;  // 是否为空节点
} TreeNode;

// 初始化顺序存储的树
void InitSqTree(TreeNode t[], int length) {
    // 将所有节点标记为空
    for (int i = 0; i < length; i++) {
        t[i].isEmpty = true;
    }
}

// 检查某个索引处的节点是否为空
bool isEmpty(TreeNode t[], int length, int index) {
    // 如果索引越界,返回空
    if (index < 0 || index >= length) {
        return true;
    }
    return t[index].isEmpty;
}

// 获取左孩子节点的索引
int getLchild(TreeNode t[], int length, int index) {
    int lchild = 2 * index + 1;
    // 检查左孩子是否为空
    if (isEmpty(t, length, lchild)) {
        printf("左孩子空\n");
        return -1;
    }
    return lchild;
}

// 获取右孩子节点的索引
int getRchild(TreeNode t[], int length, int index) {
    int rchild = 2 * index + 2;
    // 检查右孩子是否为空
    if (isEmpty(t, length, rchild)) {
        printf("右孩子空\n");
        return -1;
    }
    return rchild;
}

// 获取父节点的索引
int getFather(TreeNode t[], int length, int index) {
    // 根节点没有父节点
    if (index == 0) {
        printf("父节点为根\n");
        return -1;
    }
    return (index - 1) / 2;
}

// 访问节点,打印节点数据和数组下标
void visitNode(TreeNode* t, int index) {
    if (index < 0) {
        return;
    }
    printf("数组下标: %d, 结点数值: %f\n", index, t[index].data);
}

// 先序遍历顺序存储的树
void PreOrderSqTree(TreeNode* t, int length, int index) {
    // 如果当前节点为空,结束遍历
    if (isEmpty(t, length, index)) {
        printf("当前结点空\n");
        return;
    }
    // 访问当前节点
    visitNode(t, index);
    // 递归访问左孩子
    int lchild = getLchild(t, length, index);
    PreOrderSqTree(t, length, lchild);
    // 递归访问右孩子
    int rchild = getRchild(t, length, index);
    PreOrderSqTree(t, length, rchild);
}

// 中序遍历顺序存储的树
void InOrderSqTree(TreeNode* t, int length, int index) {
    // 如果当前节点为空,结束遍历
    if (isEmpty(t, length, index)) {
        printf("当前结点空\n");
        return;
    }
    // 递归访问左孩子
    int lchild = getLchild(t, length, index);
    InOrderSqTree(t, length, lchild);
    // 访问当前节点
    visitNode(t, index);
    // 递归访问右孩子
    int rchild = getRchild(t, length, index);
    InOrderSqTree(t, length, rchild);
}

// 后序遍历顺序存储的树
void PostOrderSqTree(TreeNode* t, int length, int index) {
    // 如果当前节点为空,结束遍历
    if (isEmpty(t, length, index)) {
        printf("当前结点空\n");
        return;
    }
    // 递归访问左孩子
    int lchild = getLchild(t, length, index);
    // 递归访问右孩子
    int rchild = getRchild(t, length, index);
    PostOrderSqTree(t, length, lchild);
    PostOrderSqTree(t, length, rchild);
    // 访问当前节点
    visitNode(t, index);
}

int main() {
    TreeNode nodes[10];
    // 初始化树
    InitSqTree(nodes, 10);
    // 设置一些节点的数据
    nodes[0].data = 1.0;
    nodes[0].isEmpty = false;
    nodes[1].data = 2.0;
    nodes[1].isEmpty = false;
    nodes[2].data = 3.0;
    nodes[2].isEmpty = false;
    nodes[3].data = 4.0;
    nodes[3].isEmpty = false;
    nodes[4].data = 5.0;
    nodes[4].isEmpty = true;
    nodes[5].isEmpty = false;  // 假设没有数据但非空
    nodes[6].data = 7.0;
    nodes[6].isEmpty = false;
    nodes[7].data = 8.0;
    nodes[7].isEmpty = false;
    nodes[8].data = 9.0;
    nodes[8].isEmpty = false;
    nodes[9].data = 10.0;
    nodes[9].isEmpty = false;

    // 进行先序遍历
    printf("先序遍历:\n");
    PreOrderSqTree(nodes, 10, 0);
    printf("\n\n\n\n\n");
    // 进行中序遍历
    printf("中序遍历:\n");
    InOrderSqTree(nodes, 10, 0);
    printf("\n\n\n\n\n");
    // 进行后序遍历
    printf("后序遍历:\n");
    PostOrderSqTree(nodes, 10, 0);

    return 0;
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

偏正北海

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值