构造二叉链表表示的二叉树:按先序次序输入二叉树中结点的值(一个字符),’#’字符表 // 示空树,构造二叉链表表示的二叉树 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;
}
posted @ 2022-05-30 20:14  ~画风人~  阅读(1028)  评论(0编辑  收藏  举报