数据结构实验4:二叉树的基本操作

这篇具有很好参考价值的文章主要介绍了数据结构实验4:二叉树的基本操作。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

一、问题描述

运用二叉链表实现二叉树的基本操作,包括:创建二叉树的存储结构、复制已有的二叉树、计算已有的二叉树的深度、先根序序列、中根序序列、后根序序列等。

输入格式:AB#C##D##

二、实验目的

掌握二叉链表及二叉树的基本操作。

三、实验内容及要求

1、构造二叉树的二叉链表数据结构。

2、实现二叉树的创建、复制、计算二叉树的深度、先根序序列、中根序序列、后根序序列等操作。

#include <iostream>
#include <queue>
#include <string>

using namespace std;

// 二叉树节点
template<class K>
struct BTreeNode
{
    BTreeNode<K>* _left;
    BTreeNode<K>* _right;
    K _key;

    BTreeNode(const K& key)
        :_left(nullptr)
        , _right(nullptr)
        , _key(key)
    {}
};

// 二叉树
template<class K>
class BTree
{
    typedef BTreeNode<K> Node;
public:
    BTree() = default;

    // 构造函数,根据层序遍历的输入格式创建二叉树
    BTree(const string& input)
    {
        int index = 0;
        _root = CreateTree(input, index);
    }

    // 计算二叉树的深度
    int GetDepth()
    {
        return _GetDepth(_root);
    }

    // 先序遍历
    void PreOrder()
    {
        _PreOrder(_root);
        cout << endl;
    }   
    
    // 中序遍历
    void InOrder()
    {
        _InOrder(_root);
        cout << endl;
    }

    // 后序遍历
    void PostOrder()
    {
        _PostOrder(_root);
        cout << endl;
    }

    // 输出树状简图
    void PrintTree()
    {
        _PrintTree(_root, "");
    }

private:
    Node* CreateTree(const string& input, int& index)
    {
        if (index >= input.size())
            return nullptr;

        if (input[index] == '#')
        {
            index++;
            return nullptr;
        }

        Node* newNode = new Node(input[index]);
        index++;
        newNode->_left = CreateTree(input, index);
        newNode->_right = CreateTree(input, index);
        return newNode;
    }

    int _GetDepth(Node* root)
    {
        if (root == nullptr)
            return 0;

        int leftDepth = _GetDepth(root->_left);
        int rightDepth = _GetDepth(root->_right);

        return max(leftDepth, rightDepth) + 1;
    }

    void _PreOrder(Node* root)
    {
        if (root == nullptr)
            return;

        cout << root->_key << " ";
        _PreOrder(root->_left);
        _PreOrder(root->_right);
    }

    void _InOrder(Node* root)
    {
        if (root == nullptr)
            return;

        _InOrder(root->_left);
        cout << root->_key << " ";
        _InOrder(root->_right);
    }

    void _PostOrder(Node* root)
    {
        if (root == nullptr)
            return;

        _PostOrder(root->_left);
        _PostOrder(root->_right);
        cout << root->_key << " ";
    }

    // 输出树状简图的辅助函数
    void _PrintTree(Node* root, const string& prefix)
    {
        if (root == nullptr)
            return;

        cout << prefix;
        cout << "|--" << root->_key << endl;

        _PrintTree(root->_left, prefix + "|   ");
        _PrintTree(root->_right, prefix + "|   ");
    }

private:
    Node* _root = nullptr;
};

int main()
{
    // 测试用例 1
    string input1 = "AB#C##D##";
    BTree<char> tree1(input1);

    cout << "测试用例 1:" << endl;
    cout << "二叉树的深度:" << tree1.GetDepth() << endl;

    cout << "先序遍历结果:";
    tree1.PreOrder();

    cout << "中序遍历结果:";
    tree1.InOrder();

    cout << "后序遍历结果:";
    tree1.PostOrder();

    cout << "树状简图:" << endl;
    tree1.PrintTree();

    cout << endl;

    // 测试用例 2
    string input2 = "1#2##3##";
    BTree<int> tree2(input2);

    cout << "测试用例 2:" << endl;
    cout << "二叉树的深度:" << tree2.GetDepth() << endl;

    cout << "先序遍历结果:";
    tree2.PreOrder();

    cout << "中序遍历结果:";
    tree2.InOrder();

    cout << "后序遍历结果:";
    tree2.PostOrder();

    cout << "树状简图:" << endl;
    tree2.PrintTree();

    return 0;
}


  • 运行结果:
    数据结构实验4:二叉树的基本操作,数据结构实验课,数据结构,算法,c语言,c++

四、数据结构设计及算法原理

在本次实验中,我们实现了一个二叉树数据结构,并添加了层序遍历构造二叉树的功能。以下是关于数据结构和算法的重点描述:

数据结构定义:

  • 我们定义了一个通用的二叉树数据结构 BTree,包含二叉树的节点 BTreeNode
// 二叉树节点
template<class K>
struct BTreeNode
{
    BTreeNode<K>* _left;
    BTreeNode<K>* _right;
    K _key;
	
    BTreeNode(const K& key)
        :_left(nullptr)
        , _right(nullptr)
        , _key(key)
    {}
};
  • 每个节点包含指向左子树和右子树的指针,以及一个键值 _key
  • 二叉树具有层序遍历构造功能,可以从输入的字符串中创建二叉树。
  • 二叉树支持计算深度、先序遍历、中序遍历、后序遍历以及树状简图的功能。

变量定义:

  • BTree 类包含一个指向根节点的私有指针 _root
  • 节点类 BTreeNode 包含左子树指针、右子树指针和键值。

运算过程流程图:

  • 构造函数 BTree(const string& input):根据层序遍历的输入格式创建二叉树。
  • 成员函数 int GetDepth():计算二叉树的深度。
  • 成员函数 void PreOrder():执行先序遍历。
  • 成员函数 void InOrder():执行中序遍历。
  • 成员函数 void PostOrder():执行后序遍历。
  • 成员函数 void PrintTree():输出树状简图。

五、测试数据及结果分析

进行了两组测试,分别使用不同的输入数据来测试二叉树的构建、深度计算和遍历功能。以下是测试数据和结果分析:

测试用例 1:

  • 输入数据:string input1 = "AB#C##D##";
  • 二叉树的深度:3
  • 先序遍历结果:A B C D
  • 中序遍历结果:C B A D
  • 后序遍历结果:C B D A

测试用例 2:

  • 输入数据:string input2 = "1#2##3##";
  • 二叉树的深度:3
  • 先序遍历结果:1 2 3
  • 中序遍历结果:2 1 3
  • 后序遍历结果:2 3 1

通过这两组测试数据,我们验证了二叉树的构建、深度计算以及不同遍历方式的正确性。代码成功实现了所需的功能。

六、总结与思考

在解决这个问题中,我学到了如何创建二叉树数据结构,并添加了根据层序遍历输入格式构造二叉树的功能。这个实验还提供了深度计算和三种不同的树遍历方式(先序、中序、后序)。

总的来说,本次实验帮助我更深入地理解了二叉树的概念和相关操作。同时,我也学会了如何通过递归来构建树和执行树的不同遍历方式。这对于编写树相关的算法和程序是非常有用的基础知识。通过解决这个问题,我对数据结构和算法的理解又进一步提高了。文章来源地址https://www.toymoban.com/news/detail-819013.html

到了这里,关于数据结构实验4:二叉树的基本操作的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • 数据结构:二叉树的基本操作(用递归实现)

             本文将通过完成以下内容来展示二叉树的基本操作,代码解释标注全面而且清晰,代码书写也十分规范,适合初学者进行学习,本篇文章算是本人的一些学习记录分享,希望对有需要的小伙伴提供一些帮助~ 本文的内容为: 用递归的方法实现以下算法: 1.以二叉

    2024年02月06日
    浏览(49)
  • 【数据结构】二叉树的存储与基本操作的实现

    二叉树的存储结构分为: 顺序存储 和类似于 链表的链式存储 这里博主讲一下链式存储 二叉树的链式存储是通过一个一个的节点引用起来的,常见的表示方式有 二叉和三叉 表示方式 二叉表示: 三叉表示: 这里博主主要讲解一下孩子表示法 在学习二叉树的基本操作前,需

    2024年02月04日
    浏览(47)
  • 二叉树的基本操作-C语言实现-数据结构作业

    目录  (1)二叉树的创建; (2)二叉树的先序、中序和后序遍历输出; (3)输出二叉树的叶子节点和度为2的节点的数量; (4)输出二叉树的深度; (5)将二叉树所有节点的左右子树互换(左子树变右子树,右子树变左子树); (6)参考书上,二叉树按层次输出(一行输出一层); (7)删除二

    2024年02月04日
    浏览(47)
  • 数据结构和算法学习记录——初识二叉树(定义、五种基本形态、几种特殊的二叉树、二叉树的重要性质、初识基本操作函数)

    目录 二叉树的定义 二叉树具体的五种基本形态 1.空树 2.只有一个节点 3.有左子树,但右子树为空 4.有右子树,但左子树为空  5.左右两子树都不为空 特殊二叉树 斜二叉树 满二叉树  完全二叉树 二叉树的几个重要性质 初识二叉树的几个操作函数  二叉树T: 一个有穷的节点

    2024年02月03日
    浏览(60)
  • 数据结构上机实验——二叉树的实现、二叉树遍历、求二叉树的深度/节点数目/叶节点数目、计算二叉树度为1或2的节点数、判断二叉树是否相似

       建立一棵二叉树,试编程实现二叉树的如下基本操作。    1.创建一棵一棵二叉算法。    2.对这棵二叉树进行遍历:先序或中序或后序,分别输出结点的遍历序列。    3.求二叉树的深度/节点数目/叶节点数目。(选做一个)    4.计算二叉树中度为1 的结点数;

    2024年02月06日
    浏览(62)
  • 【数据结构】树、二叉树的概念和二叉树的顺序结构及实现

    之前我们学习了顺序表、链表以及栈和队列这些数据结构,但这些数据结构都是线性的(一对一)。接下来要学习 非线性的数据结构——树(二叉树) ,相比前面的,树的结构更加复杂,话不多说,直接进入正题吧。 树是一种 非线性的数据结构 ,它是 一对多(也有可能是

    2024年02月07日
    浏览(41)
  • 数据结构——二叉树的链式结构

      个人主页 : 日刷百题 系列专栏 : 〖C语言小游戏〗〖Linux〗〖数据结构〗  〖C语言〗 🌎 欢迎各位 → 点赞 👍+ 收藏 ⭐️+ 留言 📝  ​ 这里我们使用先序遍历的思想来创建二叉树,这里的内容对于刚接触二叉树的朋友可能有些难理解,不妨先看完下面的二叉树各种遍历

    2024年02月05日
    浏览(47)
  • 【数据结构】二叉树的链式结构

    学习链式二叉树要知道三种遍历方式,便于对二叉树的节点以及左子树和右子树进行操作。 前序遍历:根、左子树、右子树 中序遍历:左子树、根、右子树 后序遍历:左子树、右子树、根 以下图为例: 得到的结果: 前序遍历:1 2 3 4 5 6 中序遍历:3 2 1 5 4 6 后序遍历:3 2

    2024年02月08日
    浏览(56)
  • 数据结构:二叉树的链式结构

    朋友们、伙计们,我们又见面了,本期来给大家解读一下链式二叉树的相关知识点,如果看完之后对你有一定的启发,那么请留下你的三连,祝大家心想事成! 数据结构与算法专栏 :数据结构与算法 个  人  主  页 :stackY、 C 语 言 专 栏 :C语言:从入门到精通 目录 前言

    2024年02月07日
    浏览(58)
  • 【数据结构】二叉树的介绍和二叉树堆

    💓作者简介: 加油,旭杏,目前大二,正在学习 C++ , 数据结构 等👀 💓作者主页:加油,旭杏的主页👀 ⏩本文收录在:再识C进阶的专栏👀 🚚代码仓库:旭日东升 1👀 🌹欢迎大家点赞 👍 收藏 ⭐ 加关注哦!💖        树这一概念,在我们刚开始听说的时候会觉得

    2024年01月20日
    浏览(52)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包