数据结构-实验二  树和二叉树的实现

这篇博客是广州大学学生的实验报告,内容涉及数据结构中的树和二叉树的实现,包括深度遍历和广度遍历等关键操作。
摘要由CSDN通过智能技术生成

 广州大学学生实验报告

开课实验室:计算机科学与工程实验(电子楼417)     2018年05月16日

学院

计算机科学与教育软件学院

年级、专业、班

网络161

姓名

卟咚君

学号

1606100***

实验课程名称

数据结构实验

成绩

 

实验项目名称

实验二  树和二叉树的实现

指导老师

**

一、实验类型: 验证性

实验目的:理解并运用树的操作方法

教学重点:多元树或二叉树的表示及遍历。

二、使用仪器、器材

微机一台

操作系统:WinXP

编程软件:C++

三、实验内容及原理

(1)自己选择存储方式、自己设计输入输出方式,在实验报告中清晰说明。

(2)输入一棵二叉树进行多种遍历。树的高度(设空树高度为-1)不小于4,包含了儿子数为0、1、2的结点。选做:二叉树的总结点(或叶片)数目的统计。

思路:定义一个class BinTreeNode为二叉树的结点;

定义一个class BinaryTree 为二叉树;

在BinaryTree中的build_BinaryTree()函数进行建树,输入n个结点,按照搜索二叉树的方式逐个插入每个结点的值(Insert(const Type item)),输出的时候按照树逆时针90度的方式输出,前序遍历,中序遍历,后序遍历都采用了递归的方式实现。另外,存储的方式为每一个结点都有一个左儿子结点和右儿子结点的指针,初始化时为NULL,安装不断的插入时更新。前序遍历,中序遍历,后序遍历都主要是递归实现的。比如说,前序遍历,每一次都先输出当前结点的值,然后递归访问左儿子的结点,当左儿子的结点递归访问结束的时候,再递归访问右儿子结点。在二叉树的类中,还实现了二叉树结点的总数的计数,二叉树叶子结点的计数,二叉树的高度计数。以高度为例,一个结点子树的高度等于他的儿子结点的子树中的最大的高度+1,采用递归的方式实现。

 

源代码:

#include<iostream>

#include<ctime>

#include<cmath>

#include<algorithm>

using namespace std;

const int INF = int(1e9) + 7;

template<typename Type> class BinTreeNode{   //二叉树的结点

public:

    BinTreeNode() :left(NULL), right(NULL){}

    BinTreeNode(Type item, BinTreeNode<Type> *m_left = NULL, BinTreeNode<Type> *m_right = NULL)

        :data(item), left(m_left), right(m_right){}

    Type GetData() const;     //获得该结点的data

    BinTreeNode<Type> *GetLeft() const;     //获得左儿子的结点

    BinTreeNode<Type> *GetRight() const;    //获得右儿子的结点

    void SetData(const Type data);         //设置该结点的data

    void SetLeft(const BinTreeNode<Type> *m_left);   //设置该结点的左儿子结点

    void SetRight(const BinTreeNode<Type> *m_right); //设置该结点的右儿子结点

    void InOrder();       //中序遍历

    void PreOrder();  //前序遍历

    void PostOrder(); //后序遍历

    int Size();          //返回结点总数

    int Height();     //返回二叉树的高度

    int LeavesSize();   //返回二叉树的叶子结点的总数

    void Destroy(){       //销毁二叉树

        if (this != NULL){

            this->left->Destroy();

            this->right->Destroy();

            delete this;

        }

    }

    BinTreeNode<Type> *left, *right;

    Type data;

};

template<typename Type> Type BinTreeNode<Type>::GetData() const{   //返回该结点的数值

    return this != NULL ? data : INF;

}

template<typename Type> BinTreeNode<Type>* BinTreeNode<Type>::GetLeft() const//返回该结点的左儿子的结点指针

    return this != NULL ? left : NULL;

}

template<typename Type> BinTreeNode<Type>* BinTreeNode<Type>::GetRight() const{   //返回该结点的右儿子的结点指针

    return this != NULL ? right : NULL;

}

template<typename Type> void BinTreeNode<Type>::SetData(const Type m_data){    //设置该结点的data

    if (this != NULL){

        data = m_data;

    }

}

template<typename Type> void BinTreeNode<Type>::SetLeft(const BinTreeNode<Type> *m_left){  //设置该结点的左儿子结点

    if (this != NULL){

        left =

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值