构造二叉链表表示的二叉树:按先序次序输入二叉树中结点的值(一个字符),’#’字符表 // 示空树,构造二叉链表表示的二叉树 T;再输出三种遍历序列。本题只给出部分代码,请补全。
实训笔记:
碎碎念:这道题写的时候卡了好久,卡了2个小时最后重新把代码写了一边,连带着前中后序的遍历也写的是我自己最常用的方式,卡了这莫长时间硬是写完这道题后发现题目有问题 (ノ`Д′)ノ【裂开】。
总结:总结就是遇到做不出来的题目仔细观察题目,看看是不是题目有问题嘻嘻(一般也遇不到这种情况吧 )≖‿≖✧[doge]
题目:
-
构造二叉链表表示的二叉树:按先序次序输入二叉树中结点的值(一个字符),’#’字符表
-
示空树,构造二叉链表表示的二叉树 T;再输出三种遍历序列。本题只给出部分代码,请补全
-
内容。
测试样例格式说明:
[键盘输入]
第一行:输入一棵二叉树的先序遍历序列
[正确输出]
第一行:二叉树的先序遍历序列
第二行:二叉树的中序遍历序列
第三行:二叉树的后序遍历序列
测试样例:
[第一组自测数据]
[键盘输入]
ABC####↙
[正确输出]
ABC //先序
CBA //中序
CBA //后序
[第二组自测数据]
[键盘输入]
ABD#E##FG###C#H##↙
[正确输出]
ABDEFGCH
DEBGFACH
EDGFBHCA -
这道题主要是需要将一串以先序次序排列的数据转化成二叉树,我们着重写这方面的算法。
-
结构体
typedef struct BiTNode
{
ElemType data;
struct BiTNode *lchild, *rchild; //左右孩子指针
} BiTNode, *BiTree;
- 输入数据转化为二叉树
BiTree CreateBiTree(BiTree T)
{ // 算法
// 按先序次序输入二叉树中结点的值(一个字符),’#’字符表示空树,
// 构造二叉链表表示的二叉树 T。
char ch;
scanf("%c", &ch);
if(ch == '#'){
free(T);
T = NULL;
}else{
T->data = ch;
T->lchild = (BiTree)malloc(sizeof(BiTNode));
T->lchild = CreateBiTree(T->lchild);
T->rchild = (BiTree)malloc(sizeof(BiTNode));
T->rchild = CreateBiTree(T->rchild);
}
return T;
}
-
例该算法在运行后输入 ABC#### ,算法跑起来后,会每一次捕捉一个char类型的字符
-
判断字符是否是“#”,如果是“#”则代表该树为空,非“#”字符则往下构建二叉树,
-
因为该函数返回为一个树,则需要使“T->lchild”或“T->rchild”捕捉向下构建好的子二叉树,
-
这样该函数执行完毕就会建立好一个完整的二叉树。
-
具体代码
#include <stdio.h>
#include <malloc.h>
typedef char ElemType;
typedef struct BiTNode
{
ElemType data;
struct BiTNode *lchild, *rchild; //左右孩子指针
} BiTNode, *BiTree;
BiTree CreateBiTree(BiTree T)
{ // 算法
// 按先序次序输入二叉树中结点的值(一个字符),’#’字符表示空树,
// 构造二叉链表表示的二叉树 T。
char ch;
scanf("%c", &ch);
if(ch == '#'){
free(T);
T = NULL;
}else{
T->data = ch;
T->lchild = (BiTree)malloc(sizeof(BiTNode));
T->lchild = CreateBiTree(T->lchild);
T->rchild = (BiTree)malloc(sizeof(BiTNode));
T->rchild = CreateBiTree(T->rchild);
}
return T;
} // CreateBiTree
void PreOrderTraverse(BiTree T)
{
//先序遍历二叉树 T 的递归算法
if(T!=NULL){
printf("%c",T->data);
if(T->lchild!=NULL){
PreOrderTraverse(T->lchild);
}
if(T->rchild!=NULL){
PreOrderTraverse(T->rchild);
}
}
} // PreOrderTraverse
void InOrderTraverse(BiTree T)
{
// 中序遍历二叉树 T 的递归算法
if(T!=NULL){
if(T->lchild != NULL){
InOrderTraverse(T->lchild);
}
printf("%c",T->data);
if(T->rchild != NULL){
InOrderTraverse(T->rchild);
}
}
} // InOrderTraverse
void PostOrderTraverse(BiTree T)
{
// 后序遍历二叉树 T 的递归算法
if(T!=NULL){
if(T->lchild!=NULL){
PostOrderTraverse(T->lchild);
}
if(T->rchild!=NULL){
PostOrderTraverse(T->rchild);
}
printf("%c",T->data);
}
} // PostOrderTraverse
int main() //主函数
{
BiTree T = (BiTree)malloc(sizeof(BiTNode));
T = CreateBiTree(T);
PreOrderTraverse(T);
printf("\n");
InOrderTraverse(T);
printf("\n");
PostOrderTraverse(T);
printf("\n");
return 0;
}