二叉树的遍历

本文介绍了如何在Dev-C++环境中使用递归和非递归方法遍历二叉树,包括先序、中序和后序遍历,以及自定义操作如输出结点值大于C和小于D的节点。实验内容涉及创建二叉树、定义遍历函数和使用栈实现非递归遍历。
摘要由CSDN通过智能技术生成

实验题目:二叉树的遍历

实验目的

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

实验内容

  1. 就下面给定的二叉树,创建二叉树。在这里插入图片描述

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

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

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

实验要求

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

    • 在这里插入图片描述

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

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

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

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

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

    • 在项目中新建文件“SqStack.h”,在该文件中定义顺序栈类型和实现进栈、出栈等基本运算;
      在这里插入图片描述

    • “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()里,调用相应函数,即添加如下代码:
      在这里插入图片描述

实验过程记录

  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 ",'*');
    }
}

最终运行截图:
在这里插入图片描述

  • 18
    点赞
  • 21
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值