【CS.AL】C语言实现:层次建立二叉树

代码使用C语言编写,主要包括以下部分:

定义二叉树节点和队列节点的数据结构。
构建二叉树的函数 buildBinaryTree。
前序遍历函数 preOrder。
主函数 main,从标准输入读取数据并构建二叉树,然后打印树的前序遍历结果。

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

typedef char ElemType; // 为了树中放任意类型元素方便

typedef struct node_t {
    ElemType c;
    struct node_t *pright;
    struct node_t *pleft;
} Node_t, *pNode_t;

// queue[kju]
// 辅助队列数据结构,每个元素放的树中元素节点地址值,能快速定位树中节点
typedef struct queue_t {
    pNode_t insertPos;
    struct queue_t *pNext;
} Queue_t, *pQueue_t;

void preOrder(pNode_t);

void buildBinaryTree(pNode_t *treeRoot, pQueue_t *queHead, pQueue_t *queTail, ElemType val) {
    pNode_t treeNew = (pNode_t)calloc(1, sizeof(Node_t));
    pQueue_t queNew = (pQueue_t)calloc(1, sizeof(Queue_t));

    if (treeNew == NULL || queNew == NULL) {
        printf("内存分配失败\n");
        exit(1);
    }

    pQueue_t queCur = *queHead;
    treeNew->c = val;
    queNew->insertPos = treeNew;

    if (*treeRoot == NULL) {
        *treeRoot = treeNew;
        *queHead = queNew;
        *queTail = queNew;
    } else {
        (*queTail)->pNext = queNew;
        *queTail = queNew;

        if (queCur->insertPos->pleft == NULL) {
            queCur->insertPos->pleft = treeNew;
        } else if (queCur->insertPos->pright == NULL) {
            queCur->insertPos->pright = treeNew;
            *queHead = queCur->pNext;
            free(queCur);
            queCur = NULL;
        }
    }
}

int main() {
    ElemType val;
    pNode_t treeRoot = NULL;
    pQueue_t queHead = NULL, queTail = NULL;

    printf("请输入构建二叉树的字符(以换行结束):\n");
    while (scanf("%c", &val) != EOF) {
        if (val == '\n') {
            break;
        }
        buildBinaryTree(&treeRoot, &queHead, &queTail, val);
    }

    printf("前序打印:\n");
    preOrder(treeRoot);

    // 清理内存
    while (queHead != NULL) {
        pQueue_t temp = queHead;
        queHead = queHead->pNext;
        free(temp);
    }

    return 0;
}

void preOrder(pNode_t p) {
    if (p != NULL) {
        putchar(p->c);
        preOrder(p->pleft);
        preOrder(p->pright);
    }
}

  • buildBinaryTree 函数用于根据输入值构建二叉树。
  • 使用 calloc 分配新的树节点和队列节点。
  • 如果树是空的,初始化根节点和队列头尾。
  • 否则,更新队列,插入新的节点到合适的位置(左子节点或右子节点)。
  • 如果当前节点的左右子节点都被填充,队列头指针前移,释放当前队列节点。

时间复杂度分析:

  1. 构建二叉树的时间复杂度:

    • 每插入一个节点需要在队列中查找合适的位置,并插入到树中。
    • 队列的插入和删除操作都是O(1)的。
    • 插入一个节点的时间复杂度是O(1),构建整个树的时间复杂度是O(n),其中n是节点的数量。
  2. 前序遍历的时间复杂度:

    • 前序遍历每个节点都需要访问一次,所以时间复杂度是O(n),其中n是节点的数量。

空间复杂度分析:

  1. 构建二叉树的空间复杂度:

    • 需要存储n个节点,每个节点需要固定的空间,所以空间复杂度是O(n)。
    • 需要一个辅助队列,最坏情况下队列中会存储所有节点的指针,所以空间复杂度是O(n)。
  2. 前序遍历的空间复杂度:

    • 递归调用的深度为树的高度,最坏情况下(完全不平衡的树)高度为n,所以空间复杂度是O(n)。
    • 平均情况下(平衡树)高度为log(n),所以空间复杂度是O(log(n))。
  • 1
    点赞
  • 9
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值