课时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;
}