二叉树的遍历

实验题目:二叉树的遍历

实验目的

  1. 掌握Dev-C++环境下的编译、调试和执行的方法及步骤。
  2. 掌握二叉树的先序遍历、中序遍历和后序遍历的递归算法和非递归算法。

实验内容

  1. 就下面给定的二叉树,创建二叉树。二叉树的遍历_第1张图片

  2. 实现二叉树的递归遍历算法和非递归遍历算法,依次输出二叉树的先序、中序和后序遍历序列。(非递归选作)

  3. 遍历二叉树,输出结点值大于C的结点,而小于等于C的结点用*替代。(根据代码提示,补全程序)

  4. 遍历二叉树,输出结点值小于D的结点,而大于等于D的结点用*替代。(自行完成)

实验要求

  1. 括号表示法创建二叉树(上次实验内容)
    定义二叉树结点的结构和实现创建运算CreateBTNode、输出运算DispBTNode的算法,设置结点数据的数据类型。

    • 二叉树的遍历_第2张图片

    • 在“main.cpp”里,主函数main()里定义字符数组str;

    • 在“main.cpp”里,主函数main()里声明二叉树指针变量T,调用CreateBTNode创建二叉树;

    • 在“main.cpp”里,主函数main()里调用DispBTNode显示二叉树。

  2. 实现二叉树的递归遍历算法
    -实现二叉树先序递归算法PreOrder、中序递归算法In Order、后序递归算法PostOrder;

    • 在“main.cpp”里,主函数main()里调用三种递归遍历算法,显示各自序列。
      在这里插入图片描述
  3. 实现二叉树的非递归遍历算法(选做)

    • 在项目中新建文件“SqStack.h”,在该文件中定义顺序栈类型和实现进栈、出栈等基本运算;
      二叉树的遍历_第3张图片

    • “BiTree.h”中,实现二叉树先序非递归算法NonRecurPreOrder、中序非递归算法NonRecurInOrder、后序非递归算法NonRecurPostOrder;

    • “BiTree.h”中,引入头文件#include “SqStack.h”,设置好栈中元素的数据类型,注意此时栈中元素的数据类型应为二叉树指针,即:“typedef BTNode* SElemType;”

    • 在“main.cpp”里,主函数main()里调用三种非递归遍历算法,显示各自序列。

  4. 遍历二叉树,输出结点值大于C的结点,小于等于C的用*替代

    • 采用递归遍历方式,采取在遍历过程中对每个结点调用函数的方式
    • 在文件“BiTree.h”中增加关于二叉树先序递归、中序递归和后序递归如下:
    • 在“main.cpp”里,主函数main()前面,定义函数DispLargeThanC,该函数就是递归遍历过程中,要对每个结点执行的操作,函数定义如下所示:
    typedef void Status; 
    
    • 在“main.cpp”里,主函数main()里,调用相应函数,即添加如下代码:
      二叉树的遍历_第4张图片

实验过程记录

  1. 实现二叉树的递归遍历算法
void PreOrder(BTNode *b)
{  
    if(b!=NULL)
    {
        printf("%c ",b->data);//访问根结点 
        PreOrder(b->lchild);//先序遍历左子树 
        PreOrder(b->rchild);//先序遍历右子树
    }
}
void InOrder(BTNode *b)
{  
    if(b!=NULL)
    {
        InOrder(b->lchild);//中序遍历左子树
        printf("%c ",b->data);//访问根结点 
        InOrder(b->rchild);//中序遍历右子树
    }
 }
void PostOrder(BTNode *b) 
{  
    if(b!=NULL)
    {
        PostOrder(b->lchild);//后序遍历左子树
        PostOrder(b->rchild);//后序遍历右子树
        printf("%c ",b->data);//访问根结点 
    }
}

遍历二叉树,输出结点值大于C的结点,小于等于C的用*替代

//======递归遍历算法(对二叉树中每个结点调用Visit函数)
void PreOrderTraverse(BTNode *b,Status(* Visit)(ElemType e))
{
    if (b!=NULL)  
    {  
        Visit(b->data);     //访问根节点
        PreOrderTraverse(b->lchild,Visit);
        PreOrderTraverse(b->rchild,Visit);
    }
}//PreOrderTraverse先序遍历,递归 
void InOrderTraverse(BTNode *b,Status(* Visit)(ElemType e))
{
    if (b!=NULL)  
    {  
        InOrderTraverse(b->lchild,Visit);
        Visit(b->data);     //访问根节点
        InOrderTraverse(b->rchild,Visit);
    }
}//InOrderTraverse中序遍历,递归 
void PostOrderTraverse(BTNode *b,Status(* Visit)(ElemType e))
{
    if (b!=NULL)  
    {  
        InOrderTraverse(b->lchild,Visit);
        InOrderTraverse(b->rchild,Visit);
        Visit(b->data);     //访问根节点
    }
}//PostOrderTraverse后序遍历,递归 

② 在“main.cpp”里,主函数main()前面,补全函数DispLargeThanC,DispLessThanD

③	Status DispLargeThanC(ElemType e)//该函数输出树中大于C的字符,请补全代码 
{
    if(e>'D') 
    {
        printf("%c ",e);
    }
    else
    {
        printf("%c ",'*');
    }
}
④	
Status DispLessThanD(ElemType e)//该函数输出树中小于D的字符,请补全代码
{
    if(e<'D') 
    {
        printf("%c ",e);
    }
    else
    {
        printf("%c ",'*');
    }
}

最终运行截图:
二叉树的遍历_第5张图片

你可能感兴趣的:(算法,c++,c语言)