二叉树的链式表示及实现(实验6--作业)

一、功能概述

这段 C++ 代码实现了二叉树的一系列操作,包括创建二叉树、前序遍历、中序遍历、后序遍历、层次遍历、中序非递归遍历、求二叉树深度、交换左右子树、统计节点个数以及销毁二叉树等功能。

二、主要数据结构和类型定义

  1. BiTNode结构体表示二叉树的节点,包含数据域data和左右子节点指针leftright
  2. BiTree是指向BiTNode的指针类型,用于表示二叉树。
  3. 定义了一些宏,如MAXSIZE表示最大长度、OVERFLOw表示内存分配失败的返回值等,并定义了状态类型Status

三、主要函数功能

  1. CreateBiTree:通过输入字符序列创建二叉树,若输入#表示空节点。
  2. preOrder:前序遍历二叉树,先访问根节点,再遍历左子树和右子树。
  3. inOrder:中序遍历二叉树,先遍历左子树,再访问根节点,最后遍历右子树。
  4. postOrder:后序遍历二叉树,先遍历左子树和右子树,最后访问根节点。
  5. levelOrder:层次遍历二叉树,利用队列实现。
  6. Order:中序非递归遍历二叉树,利用栈实现。
  7. Depth:求二叉树的深度,通过递归计算左右子树深度并取较大值加一得到。
  8. Swap:递归交换二叉树的左右子树。
  9. Count:统计二叉树的节点个数,通过递归累加左右子树节点个数加一得到。
  10. DestroyBiTree:销毁二叉树,通过递归释放每个节点的内存。

四、主函数流程

  1. 在主函数中,首先初始化一个二叉树Tnullptr
  2. 调用CreateBiTree创建二叉树。
  3. 输出二叉树交换左右子树前的各种遍历结果、深度和节点个数。
  4. 调用Swap交换二叉树的左右子树。
  5. 输出交换后的各种遍历结果、深度和节点个数。
  6. 调用DestroyBiTree销毁二叉树。
#include<bits/stdc++.h>//万能头文件
using namespace std;//命名空间#define MAXSIZE 100 //最大长度
#define OVERFLOw -2
#define OK 1
#define TeleType char
#define ERROR 0typedef int Status;typedef struct TreeNode{TeleType data;//左右子结点struct TreeNode* left;struct TreeNode* right;
}BiTNode,*BiTree;// 树的创建
void CreateBiTree(BiTree& T) {TeleType ch;cin >> ch;if (ch == '#')T = nullptr;else {T = new BiTNode;if (!T)exit(OVERFLOw); // 内存分配失败T->data = ch;CreateBiTree(T->left); // 左子树CreateBiTree(T->right); // 右子树}
}// 前序遍历  
void preOrder(BiTree& T) {// 根 左 右if (T) {cout << T->data << " ";preOrder(T->left);preOrder(T->right);}
}
//中序遍历  
void inOrder(BiTree& T){// 左 根 右if(T){inOrder(T->left);cout << T->data << " ";inOrder(T->right);}
}
//后序遍历  
void postOrder(BiTree& T){//右 根 左if(T){postOrder(T->right);cout << T->data << " ";postOrder(T->left);}
}
//层次遍历  
void levelOrder(BiTree& T){if(!T) return ;//树为空 直接返回queue<BiTree> q;//元素类型为BiTree的队列q.push(T);//初始根节点填入while(!q.empty()){BiTree node = q.front();//临时存当前节点q.pop();//当前节点出队cout<<node->data<<" ";//打印当前节点//看当前节点的另外两个节点if(node->left){q.push(node->left);}if(node->right){q.push(node->right);}}
}
//中序非递归遍历  
void Order(BiTree& T){stack<BiTree> St;BiTNode* p = T;while(p||!St.empty()){if(p){St.push(p);p = p->left;}else{p = St.top();St.pop();cout<<p->data<<" ";p = p->right;}
}
}
//求二叉树深度
int Depth(BiTree& T){if(!T) return 0;//空的情况下return max(Depth(T->left)+1,Depth(T->right)+1);
}
//递归交换左右子树
void Swap(BiTree& T){if(T){Swap(T->left);Swap(T->right);BiTree temp = T->left;T->left = T->right;T->right = temp;}
}
//统计节点个数
int Count(BiTree& T){if(!T) return 0;return Count(T->left)+Count(T->right)+1;
}
//销毁二叉树
void DestroyBiTree(BiTree& T) {//根节点到最后删除if (T) {DestroyBiTree(T->left);DestroyBiTree(T->right);delete T;T = nullptr;}
}
int main() {BiTree T = nullptr; // 注意这里初始化为 nullptrCreateBiTree(T);cout<<"左右子树交换前: "<<endl;cout<<"前序遍历   : ";preOrder(T); cout<<endl;cout<<"中序遍历   : ";inOrder(T);cout<<endl;cout<<"后序遍历   : ";postOrder(T);cout<<endl;cout<<"层次遍历   : ";levelOrder(T);cout<<endl;cout<<"左右子树交换后: "<<endl;Swap(T);cout<<"前序遍历   : ";preOrder(T); cout<<endl;cout<<"中序遍历   : ";inOrder(T);cout<<endl;cout<<"非递归中序 : ";Order(T);cout<<endl;cout<<"后序遍历   : ";postOrder(T);cout<<endl;cout<<"层次遍历   : ";levelOrder(T);cout<<endl;cout<<"二叉树深度 = "<<Depth(T)<<endl;cout<<"节点个数 = "<<Count(T)<<endl;DestroyBiTree(T);return 0;
}

五、运行结果如图所示 

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

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

相关文章

三维测量与建模笔记 - 2.1 坐标转换基础

2D坐标变换 平移可以看做是对原始的x和y加上了一个偏移&#xff0c;也可以理解为按照给定的平移向量进行移动。 缩放变换&#xff0c;本质是对x&#xff0c;y乘上一个缩放系数。 综合缩放、旋转、平移 矩阵乘法的顺序会对结果有影响&#xff0c;需要注意。 2D欧氏变换 2D欧式…

LeetCode_2119. 反转两次的数字_java

1、题目 2119. 反转两次的数字https://leetcode.cn/problems/a-number-after-a-double-reversal/ 反转 一个整数意味着倒置它的所有位。 例如&#xff0c;反转 2021 得到 1202 。反转 12300 得到 321 &#xff0c;不保留前导零 。 给你一个整数 num &#xff0c;反转 num 得…

二十四、Python基础语法(变量进阶)

一、引用 在定义变量的时候, 解释器会给变量和数据分别在内存中分配内存&#xff0c;变量中保存的是数据的地址, 称为引用&#xff0c;Python 中数据的传递,传递的都是引用&#xff0c;可以使用 id(变量) 函数,获取变量中引用地址。 # 将数字1在内存中的地址储存到变量a中 a …

NVR监测软件/设备EasyNVRNVR批量管理软件/平台多元接入方式与应用实例

在数字化安防时代&#xff0c;视频监控技术已成为维护公共安全、提升管理效能的重要基石。随着科技的飞速发展&#xff0c;流媒体技术和视频监控正经历着前所未有的变革与融合。NVR小程序接入平台/设备EasyNVR&#xff0c;作为一款基于“云-边-端”一体化架构的视频融合云平台&…

【归一化技术】层归一化和批归一化

归一化技术在深度学习中被广泛应用&#xff0c;以加速训练过程、稳定模型收敛&#xff0c;并减少梯度消失或爆炸问题。 一、 层归一化 **层归一化&#xff08;Layer Normalization&#xff09;**是一种归一化技术&#xff0c;广泛用于深度学习模型&#xff0c;尤其是在 Trans…

RWA“两链一桥”平台在香港金融科技周亮相

第九届香港金融科技周今日开幕&#xff0c;记者在主题为Trust Bridge的论坛上获悉&#xff0c;蚂蚁数科旗下蚂蚁链在此次金融科技周首次公开了其为RWA业务打造的“两链一桥”平台&#xff0c;旨在帮助更多内地新能源资产赴港RWA&#xff0c;实现技术赋能实体资产。 “两链一桥“…

简记Vue3(二)—— computed、watch、watchEffect

个人简介 &#x1f440;个人主页&#xff1a; 前端杂货铺 &#x1f64b;‍♂️学习方向&#xff1a; 主攻前端方向&#xff0c;正逐渐往全干发展 &#x1f4c3;个人状态&#xff1a; 研发工程师&#xff0c;现效力于中国工业软件事业 &#x1f680;人生格言&#xff1a; 积跬步…

Android Gradle

#1024程序员节&#xff5c;征文# Gradle 是一款强大的自动化构建工具&#xff0c;广泛应用于 Android 应用开发。它通过灵活的配置和丰富的插件系统&#xff0c;为项目构建提供了极大的便利。本文只是简单的介绍 Gradle 在 Android 开发中的使用&#xff0c;包括其核心概念、构…

Go 语言基础教程:7.Switch 语句

在这篇教程中&#xff0c;我们将学习 Go 语言中的 switch 语句&#xff0c;它是条件分支的重要结构。我们将通过一个示例程序逐步解析 switch 的不同用法。 package mainimport ("fmt""time" )func main() {i : 2fmt.Print("Write ", i, " …

拖拽盖章处理

进行元素拖拽&#xff1a;同类章替换、删除已盖章 1.复制对应元素&#xff0c;在onmousemove中left和top一直在变化 2.onmouseup时&#xff0c;计算出在pdf显示区域内的left&#xff0c;top&#xff0c;removeChild删除原先复制的元素&#xff0c;再appendChild到pdf显示区域的…

高翔【自动驾驶与机器人中的SLAM技术】学习笔记(十二)拓展图优化库g2o(一)框架

【转载】理解图优化&#xff0c;一步步带你看懂g2o框架 文章来源&#xff1a;理解图优化&#xff0c;一步步带你看懂g2o框架 小白&#xff1a;师兄师兄&#xff0c;最近我在看SLAM的优化算法&#xff0c;有种方法叫“图优化”&#xff0c;以前学习算法的时候还有一个优化方法…

【建造&机械】木材运输车辆检测系统源码&数据集全套:改进yolo11-GhostHGNetV2

改进yolo11-SPPF-LSKA等200全套创新点大全&#xff1a;木材运输车辆检测系统源码&#xff06;数据集全套 1.图片效果展示 项目来源 人工智能促进会 2024.10.28 注意&#xff1a;由于项目一直在更新迭代&#xff0c;上面“1.图片效果展示”和“2.视频效果展示”展示的系统图片…

C++与现代开发实践第三节:多线程与并发编程

第四章&#xff1a;C与现代开发实践 第三节&#xff1a;多线程与并发编程 在这一课中&#xff0c;我们将详细探讨多线程与并发编程的各个方面&#xff0c;特别是从线程的创建、管理到高级的优化技术&#xff0c;并且通过复杂的实战案例来展示如何应对并发问题。最后&#xff…

python实现放烟花效果庆祝元旦

马上就要2025年元旦啦&#xff0c;提前祝大家新年快乐 完整代码下载地址&#xff1a;https://download.csdn.net/download/ture_mydream/89926458

Prompt提示词设计:如何让你的AI对话更智能?

Prompt设计&#xff1a;如何让你的AI对话更智能&#xff1f; 在人工智能的世界里&#xff0c;Prompt&#xff08;提示词&#xff09;就像是一把钥匙&#xff0c;能够解锁AI的潜力&#xff0c;让它更好地理解和响应你的需求。今天&#xff0c;我们就来聊聊如何通过精心设计的Pr…

部署RocketMQ, 其实很简单 (带图, 附启动命令)

目录 一 下载 RocketMQ 二 上传解压 2.1 文件上传 2.2 文件解压 三 配置RocketMQ 3.1 修改runserver.sh 3.2 修改runbroker.sh 3.3 配置环境变量 四 启动RocketMQ 4.1 启动namesrv服务 4.2 启动broker 服务 五 关闭RocketMQ 一 下载 RocketMQ 官网下载…

双十一有哪些值得入手的好物?盘点五款优惠又好用的好物推荐!

一眨眼&#xff0c;2024年双十一已经到来。自古以来&#xff0c;双十一不仅是购物狂欢的节日&#xff0c;更是消费者们尽情享受优惠和好物的绝佳时机。在这个热潮中&#xff0c;很多人都会提前准备好购物清单&#xff0c;寻觅心仪的商品。为了帮助大家在这个购物节中不空手而归…

【AIGC】ChatGPT提示词Prompt精确控制指南:Scott Guthrie的建议详解与普通用户实践解析

博客主页&#xff1a; [小ᶻZ࿆] 本文专栏: AIGC | ChatGPT 文章目录 &#x1f4af;前言&#x1f4af;斯科特古斯里&#xff08;Scott Guthrie&#xff09;的建议解读人机交互设计的重要性减轻用户认知负担提高Prompt的易用性结论 &#x1f4af;普通用户视角的分析普通用户…

MySQL(2)【库的操作】

阅读导航 引言一、创建数据库1. 基本语法2. 创建数据库案例&#x1f4cc;创建名为db1的数据库&#x1f4cc;创建一个使用utf8字符集的db2数据库&#x1f4cc;创建一个使用utf8字符集&#xff0c;并带校对规则的db3数据库 二、字符集和校验规则1. 查看系统默认字符集以及校验规则…

铜业机器人剥片 - SNK施努卡

SNK施努卡有色行业电解车间铜业机器人剥片 铜业机器人剥片技术是针对传统人工剥片效率低下、工作环境恶劣及生产质量不稳定的痛点而发展起来的自动化解决方案。 面临人工剥片的诸多挑战&#xff0c;包括低效率、工作环境差、人员流动大以及产品质量控制不精确等问题。 人工剥片…