• 大学课程实验2指导-二叉树的建立与遍历


    实验目的:

    • 深入理解二叉树的递归建立以及遍历过程。
    • 了解二叉树遍历的非递归算法。

    实验内容:

    对于如下的二叉树:

    要求编程实现:

    1.以递归方式建立该二叉树。

    2.以递归方式实现对该二叉树的先序、中序和后序遍历。

    步骤1:包含必要的函数库

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

    步骤2:实现结构体BiTNode

    1 typedef struct BiTNode{
    2         char data;
    3         struct BiTNode *lchild, *rchild;
    4 }BiTNode, *BiTree;

    步骤3:实现函数Create_BiTree()

    void Create_BiTree(BiTree *T)

    F提示1:参数T为指向"二叉树的头结点指针"的指针即

    BiTree *T;

    等价于

    BiTNode **T;

    F提示2:由于需要在函数中修改T所指向的指针的内容(即调用Create_BiTree ()之前,指向"二叉树的根结点"的指针为空,调用Create_BiTree ()之后,该指针指向新创建的根结点),因此需要在T前加"*"号。

    F提示3:由于*T表示二叉树根结点的地址,因此在修改根结点的data域时,可以执行:

    (*T)->data=ch;

    等价于

    (*(*T)).data=ch;

    F提示4:由于函数的参数类型为"指向指针的指针",因此在创建左、右子数时,需要传入左、右的根结点的地址,即&(*T)->lchild或&(*T)->rchild。

    F提示5:malloc()函数是在函数库stdlib.h中定义的,因此必须引入该库

     1 /*构造二叉树的二叉链表T */
     2 
     3 void Create_BiTree(BiTree *T){
     4 
     5     char ch;
     6 
     7     ch=getchar();
     8 
     9     //若输入'@',则建立空二叉树
    10 
    11     if(ch=='@') *T=NULL;
    12 
    13     else{
    14 
    15     *T=(BiTree)malloc(sizeof(BiTNode));
    16 
    17         /*生成根结点*/
    18 
    19 (*T)->data=ch;
    20 
    21 /*构造左子树*/
    22 
    23 Create_BiTree(&(*T)->lchild);
    24 
    25 /*构造右子树*/
    26 
    27         Create_BiTree(&(*T)->rchild);
    28 
    29      }
    30 
    31 }

    步骤4:实现遍历函数PreOrder()、InOrder()、PostOrder()

    提示5:这些函数均采用递归方式实现。另外,在访问某个结点时,无需采用课本中的函数指针visit,仅需要利用printf()函数打印该结点的data域即可。三个遍历函数的声明如下:

    1 void PreOrder(BiTree T);
    2 
    3 void InOrder(BiTree T);
    4 
    5 void PostOrder(BiTree T);

    步骤5:在主函数中实现对二叉树的建立以及前、中、后序遍历

     1 int main()
     2 
     3 {
     4 
     5 /*声明BiTree类型指针T,它的作用是将来指向新创建的二叉树的根*/
     6 
     7 BiTree T;
     8 
     9     printf("
    输入叶结点的信息(建立空二叉树输入@): ");
    10 
    11     /*可以输入以下的测试数据ABC@@DE@G@@F@@@ */
    12 
    13     
    14 
    15 /*建立二叉树T*/
    16 
    17 Create_BiTree(&T);
    18 
    19     printf("
    ");
    20 
    21     printf("
    前序遍历结果: ");
    22 
    23     PreOrder(T);
    24 
    25     printf("
    中序遍历结果: ");
    26 
    27     InOrder(T);
    28 
    29     printf("
    后序遍历结果: ");
    30 
    31     PostOrder(T);
    32 
    33     printf("
    ");
    34 
    35 }

    程序提示输入测试数据

     

    输入测试数据

    最终输出效果

    思考题

    1.思考如何实现以非递归方式遍历二叉树?

     1 /*先序遍历二叉树*/
     2 
     3 void PreOrder(BiTree T){
     4 
     5     if(T){
     6 
     7         printf("%3c",T->data);
     8 
     9         PreOrder(T->lchild);
    10 
    11         PreOrder(T->rchild);
    12 
    13      }
    14 
    15 }
    16 
    17 /*中序遍历二叉树*/
    18 
    19 void InOrder(BiTree T){
    20 
    21     if(T){
    22 
    23         InOrder(T->lchild);
    24 
    25         printf("%3c",T->data);
    26 
    27         InOrder(T->rchild);
    28 
    29      }
    30 
    31 }
    32 
    33 /*后序遍历二叉树*/
    34 
    35 void PostOrder(BiTree T){
    36
    37     if(T){
    38 
    39         PostOrder(T->lchild);
    40 
    41         PostOrder(T->rchild);
    42 
    43         printf("%3c",T->data);
    44 
    45     }
    46 
    47 }
    昔日我曾苍老,如今风华正茂(ง •̀_•́)ง
  • 相关阅读:
    wxpython快速入门
    python核心编程 第四章 和第五章
    python核心编程 第三章
    python核心编程 第二章 快速入门
    Nginx 使用札记
    PHP 函数总结
    node.js安装部署
    linux
    在Linux上安装Git
    php超级全局变量
  • 原文地址:https://www.cnblogs.com/lgqrlchinese/p/10073648.html
Copyright © 2020-2023  润新知