王道OJ课时14作业2

文章描述了如何使用C语言实现一个二叉树,通过输入字符串abcdefghij,进行中序遍历(hdibjeafcg)、后序遍历(hidjebfgca)和层序遍历(abcdefghij),展示了先序、中序和后序遍历的算法实现以及层序遍历的具体步骤。
摘要由CSDN通过智能技术生成

课时14作业2

Description

读取字符串abcdefghij,然后层次建树建立一颗二叉树,然后中序遍历输出 hdibjeafcg,后序遍历输出 hidjebfgca,层序遍历输出abcdefghij,注意不要输出汉字

Input

abcdefghij

Output

中序遍历输出hdibjeafcg,后序遍历输出 hidjebfgca,层序遍历输出abcdefghij,每个一行

Sample Input 1 

abcdefghij

Sample Output 1

hdibjeafcg
hidjebfgca
abcdefghij
#include <stdlib.h>
#include <stdio.h>

#define BiElemType char

// 定义二叉树的节点结构
typedef struct BiTNode {
    BiElemType data; // 节点存储的数据
    struct BiTNode *lNode; // 指向左子节点的指针
    struct BiTNode *rNode; // 指向右子节点的指针
} BiTNode, *BiTree;

// 定义用于层序遍历的标签结构
typedef struct tag {
    BiTNode *elem; // 指向当前遍历到的二叉树节点
    struct tag *next; // 指向下一个标签的指针
} Tag, *PTag;

// 先序遍历二叉树
void firstVisit(BiTree biTree) {
    if (biTree == NULL) {
        return;
    }
    printf("%c", biTree->data); // 访问根节点
    firstVisit(biTree->lNode); // 递归遍历左子树
    firstVisit(biTree->rNode); // 递归遍历右子树
}

// 中序遍历二叉树
void midVisit(BiTree biTree) {
    if (biTree == NULL) {
        return;
    }
    midVisit(biTree->lNode); // 递归遍历左子树
    printf("%c", biTree->data); // 访问根节点
    midVisit(biTree->rNode); // 递归遍历右子树
}

// 后序遍历二叉树
void lastVisit(BiTree biTree) {
    if (biTree == NULL) {
        return;
    }
    lastVisit(biTree->lNode); // 递归遍历左子树
    lastVisit(biTree->rNode); // 递归遍历右子树
    printf("%c", biTree->data); // 访问根节点
}

// 层序遍历二叉树
void layerVisit(BiTree biTree) {
    if (biTree == NULL) {
        return;
    }

    // 初始化队列头、当前节点、队列尾和新元素指针
    PTag pHead, pCur, pTail, pNewElem;
    pNewElem = (PTag) malloc(sizeof(Tag));
    pNewElem->elem = biTree;
    pNewElem->next = NULL;
    pHead = pCur = pTail = pNewElem;

    // 当前节点不为空时循环
    while (pCur != NULL) {
        // 如果当前节点有左子节点,将其加入队列
        if (pCur->elem->lNode != NULL) {
            pNewElem = (PTag) malloc(sizeof(Tag));
            pNewElem->elem = pCur->elem->lNode;
            pNewElem->next = NULL;
            pTail->next = pNewElem;
            pTail = pTail->next;
        }
        // 如果当前节点有右子节点,将其加入队列
        if (pCur->elem->rNode != NULL) {
            pNewElem = (PTag) malloc(sizeof(Tag));
            pNewElem->elem = pCur->elem->rNode;
            pNewElem->next = NULL;
            pTail->next = pNewElem;
            pTail = pTail->next;
        }
        // 访问当前节点
        printf("%c", pCur->elem->data);
        // 移动到下一个节点
        pCur = pCur->next;
    }
}

int main() {

    BiTree biTree;
    biTree = NULL;

    // 这部分代码用于读取输入字符并构建二叉树
    PTag pHead, pCur, pTail, pNewElem;
    char c;

    while (scanf("%c", &c) != EOF) {

        if (c == '\n') {
            midVisit(biTree); // 中序遍历
            printf("\n");
            lastVisit(biTree); // 后序遍历
            printf("\n");
            layerVisit(biTree); // 层序遍历
            exit(0);
        } else {
            // 创建新节点并添加到二叉树中
            BiTNode *newNode = (BiTNode *) malloc(sizeof(BiTNode));
            newNode->data = c;
            newNode->lNode = NULL;
            newNode->rNode = NULL;
            pNewElem = (PTag) malloc(sizeof(Tag));
            pNewElem->elem = newNode;
            pNewElem->next = NULL;
            if (biTree == NULL) {
                biTree = newNode;
                pTail = pNewElem;
                pHead = pNewElem;
                pCur = pNewElem;
                continue;
            } else {
                pTail->next = pNewElem;
                pTail = pTail->next;
            }

            // 将新节点作为左子节点或右子节点添加到二叉树中
            if (pCur->elem->lNode == NULL) {
                pCur->elem->lNode = newNode;
            } else if (pCur->elem->rNode == NULL) {
                pCur->elem->rNode = newNode;
                pCur = pCur->next;
            }
        }
    }

    return 0;
}

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

老刘莱国瑞

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

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

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

打赏作者

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

抵扣说明:

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

余额充值