数据结构实验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()
{// 测试用例 1string 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;// 测试用例 2string 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;
}
  • 运行结果:
    请添加图片描述

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

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

数据结构定义:

  • 我们定义了一个通用的二叉树数据结构 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

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

六、总结与思考

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

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

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.hqwc.cn/news/419473.html

如若内容造成侵权/违法违规/事实不符,请联系编程知识网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

算法练习-替换数字(思路+流程图+代码)

难度参考 难度&#xff1a;简单 分类&#xff1a;字符串 难度与分类由我所参与的培训课程提供&#xff0c;但需要注意的是&#xff0c;难度与分类仅供参考。以下内容均为个人笔记&#xff0c;旨在督促自己认真学习。 题目 给定一个字符串S,它包含小写字母和数字字符&#xff0…

php基础学习之代码框架

一&#xff0c;标记 脚本标记&#xff08;已弃用&#xff09;&#xff1a;<script language"php"> php代码 </script> 标准标记&#xff1a;<?php php代码 ?> 二&#xff0c;基础输出语句 不是函数&#xff0c;…

计算机网络基础概念解释

​ 1. 什么是网络 随着时代的发展&#xff0c;越来越需要计算机之间互相通信&#xff0c;共享软件和数据&#xff0c;即以多个计算机协同⼯作来完成业务&#xff0c;于是有了网络互连。 网络互连&#xff1a;将多台计算机连接在⼀起&#xff0c;完成数据共享。 数据共享本质是…

【网站项目】基于jsp的199旅游景点管理系统

&#x1f64a;作者简介&#xff1a;多年一线开发工作经验&#xff0c;分享技术代码帮助学生学习&#xff0c;独立完成自己的项目或者毕业设计。 代码可以私聊博主获取。&#x1f339;赠送计算机毕业设计600个选题excel文件&#xff0c;帮助大学选题。赠送开题报告模板&#xff…

gin渲染篇

1. 各种数据格式的响应 json、结构体、XML、YAML类似于java的properties、ProtoBuf package mainimport ("github.com/gin-gonic/gin""github.com/gin-gonic/gin/testdata/protoexample" )// 多种响应方式 func main() {// 1.创建路由// 默认使用了2个中…

django邮件通知功能-

需求&#xff1a; 1&#xff1a;下单人员下订单时需要向组长和投流手发送邮件通知 2&#xff1a;为何使用邮件通知功能&#xff1f;因为没钱去开通短信通知功能 设计 1&#xff1a;给用户信息表添加2个字段 第一个字段为&#xff1a;是否开通邮件通知的布尔值 第二个字段为: 用…

k3s x GitLab Runner Operator,GitLab CI 云原生构建新体验

GitLab CI 是非常常用的一款 CI/CD 工具&#xff0c;只需要在 .gitlab-ci.yml 文件中用 YAML 语法编写 CI/CD 流水线即可。而 GitLab CI 能够运行的关键组件是 GitLab Runner。GitLab Runner 是一个轻量级、高扩展的代理&#xff0c;主要用来执行 GitLab CI/CD 流水线中的 Job&…

旅游项目day10

1. 内容评论 1.1 评论表结构设计 id&#xff0c;content&#xff0c;user_id&#xff0c;article_id&#xff0c;ref_comment_id&#xff0c;create_time&#xff0c;likes&#xff0c;state 存储到MySQL行否&#xff1f; 存储到MongoDB行否&#xff1f; 使用MongoDB来实现。…

四个简单的bat脚本

Windows11 最大劝退点就是这个右键菜单&#xff0c;复制粘贴都变成一点点的小图标&#xff0c;最气人的是点击底部的显示更多选项才能展示全部功能。让许多本来点一次就能完成的操作变成两次。其实使用一个小命令就能修改回win10版本的菜单。四个简单的bat脚本&#xff0c;能完…

【机组】存储器、总线及堆栈寄存器实验的解密与实战

​&#x1f308;个人主页&#xff1a;Sarapines Programmer&#x1f525; 系列专栏&#xff1a;《机组 | 模块单元实验》⏰诗赋清音&#xff1a;云生高巅梦远游&#xff0c; 星光点缀碧海愁。 山川深邃情难晤&#xff0c; 剑气凌云志自修。 ​ ​ ​​​​​​​​ 目录 &…

人工智能原理实验2(2)——罗马尼亚问题(贪婪搜索、A*搜索、BFS、DFS)

&#x1f9e1;&#x1f9e1;实验内容&#x1f9e1;&#x1f9e1; 根据上图以Zerind为初始状态&#xff0c;Bucharest为目标状态实现搜索&#xff0c;分别以贪婪搜索&#xff08;只考虑直线距离&#xff09;和A算法求解最短路径。 按顺序列出贪婪算法探索的扩展节点和其估价函数…

(超详细)9-YOLOV5改进-添加EffectiveSEModule注意力机制

1、在yolov5/models下面新建一个EffectiveSEModule.py文件&#xff0c;在里面放入下面的代码 代码如下&#xff1a; import torch from torch import nn as nn from timm.models.layers.create_act import create_act_layerclass EffectiveSEModule(nn.Module):def __init__…