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

二叉树链式存储的实现 //filename:bitree.h #include #include #include #define OK 1 #define ERROR 0 #define TRUE 1 #define FALSE 0 #define NIL '#' //定义'#'为空节点 typedef struct queue_node qnode; typedef struct bitree_nod 阅读详情

一、功能概述

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

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

  1. BiTNode结构体表示二叉树的节点,包含数据域data和左右子节点指针left、right。
  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. 在主函数中,首先初始化一个二叉树T为nullptr。
  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 0

typedef 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->left);
		postOrder(T->right);
		cout << T->data << " ";
	
	}
}
//层次遍历  
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; // 注意这里初始化为 nullptr
	CreateBiTree(T);
/*	 A					A
	/ \				   / \	
   B   C			  C	  B
  / \ / \	===》	 / \ / \
 D  E F  G			G  F E  D
   / \					/ \
  H   I				   I   H
原先二叉树           交换后的

应输入
ABD##EH##I##CF##G##

	*/
	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;
}

五、运行结果如图所示 

二叉树的链式存储 二叉树的链式存储结构 阅读详情

相关推荐

【数据结构】极致详解:树与二叉树(下)——链式存储实现

上节课我们学习了关于堆的应用,即 TOP-K 问题的解决方法,实现了各接口功能,同时标志着我们关于二叉树顺序存储结构的完美结束。而这节课我们就将继续研究二叉树的另一种存储结构,即二叉树链式存储结构的相关接口功能的实现。

weixin_59392935的博客 2071

DS初阶:二叉树的链式结构及实现

以下的学习中要重点理解二叉树中的递归思想和分治思想 !

weixin_51142926的博客 8361

二叉树的存储表示与实现

二叉树的顺序存储 完全二叉树的存储可以按照从上到下,从左到右的顺序依次存储在一维数组中。完全二叉树的顺序存储如图所示:                 如果按照从上到下,从左到右的顺序把非完全二叉树也同样的编号,将结点依次存放在一维数组中,为了能够正确反映二叉树中结点之间的逻辑关系,需要在一维数组中将二叉树中不存在的结点位置空出。   顺序存储对于完全二叉树来说是

韦婵娟 3325

解锁二叉树的魅力:链式实现详解

在数据结构的浩瀚星空中,二叉树如同一颗璀璨的明珠,其优雅的结构和强大的功能使其成为计算机科学中不可或缺的工具。从数据库索引到编译器的语法树,二叉树以其独特的方式支撑着许多核心算法与数据处理。本文将深入探讨如何使用C语言实现二叉树的链式结构,并详细讲解各个部分的实现。

平凡程序猿~的博客 4070

【数据结构】二叉树链式结构的实现

二叉树链式结构梳理、C语言实现链式二叉树

StackFrame 2322

自学ROS完成智能小车路径规划(一)--配置功能包

此系列文章记录本人学习ros的过程,将会尽可能详细以便自己能够看懂 参考系列:古月居老师,优快云,ROS tutorials,科大讯飞智能车竞赛线上赛 本文章的目标: 比较全局路径规划算法中A*算法与Dijkstra算法在该地图场景下的规划与运行时间 比较局部路径规划算法中DWA算法与TEB算法在该地图场景下的规划与运行时间 在同等参数条件下选择出各自适合的算法进行融合,经过比较,我将选择dijkstra算法作为全局路径规划算法,TEB算法为局部路径规划算法 第一步,按照科大讯飞的教程配置文件 科大讯

weixin_42621524的博客 9365

链式二叉树的实现

欢迎来到HanLop博客的C语言数据结构初阶系列。在这个系列中,我们将深入探讨各种基本的数据结构和算法,帮助您打下坚实的编程基础。在本篇文章中,我们将探讨另一种重要的二叉树数据结构——链式二叉树(Linked Binary Tree)。不同于顺序结构的二叉树,链式二叉树使用链表节点来存储树中的元素,使其在内存分配和动态调整上具有更大的灵活性。链式二叉树在许多编程问题中都有广泛应用,特别是在递归算法和树遍历等方面。本篇文章将介绍链式二叉树的基本概念、创建方法、基本操作以及其在实际编程中的应用。

m0_73605503的博客 1556

碎碎念android eMMC【转】

本文转载自:https://blog.youkuaiyun.com/Fybon/article/details/44242549 一、/dev/blockroot@:/dev/block #lsbootdevicemmcblk0mmcblk0p1mmcblk0p10…….mmcblk0p18mmcblk0p19mmcblk0p2mmcblk0p20……mmcblk0p29mmcblk0p3mmcblk0p3...

zzb2760715357的博客 377

二叉树链式结构的实现

二叉树链式实现

weixin_70238476的博客 1253

SAP MTO模式实战:从库存管理到成本核算的深度解析

本文深入解析SAP MTO(Make-to-Order)模式在制造业中的应用,从库存管理到成本核算的全流程实战技巧。通过对比MTS模式,详细阐述MTO的核心逻辑、库存管理配置、成本核算路径及与PP模块的集成要点,帮助企业实现按单生产的高效管理,优化库存水平和资金占用。

weixin_29204205的博客 709

芒果YOLO11改进137:卷积AKConv篇,即插即用,具有任意采样形状和任意数量的参数的卷积内核

卷积AKConv篇,即插即用,具有任意采样形状和任意数量的参数的卷积内核

包括YOLOv5、YOLOv7、YOLOv8等模型改进 295

【java数据结构】模拟二叉树的链式结构之孩子表示法,掌握背后的实现逻辑

本篇用大量形象易懂的图演示了二叉树的逻辑结构,物理结构,以及二叉树的常用性质,并且用递归思想实现了二叉树的四种遍历,以及关于二叉树的常见操作的代码,对每段代码的实现逻辑都附有关键图片以及文字解释。

m0_74284629的博客 1814

Microsemi Libero系列教程(一)——Libero开发环境介绍、下载、安装与注册

前言 相比与Xilinx和Altera在国内的市场,Microsemi的FPGA在国内应用很少很少,网上几乎没有详细的教程,刚开始使用时,遇到了各种问题,自己也走了不少弯路。本系列教程以Libero V11.8.2.4,SmartFusion系列A2F200M3F FPGA芯片为例,将详细介绍Libero SoC软件的基本使用,及使用过程中遇到一些问题的解决方法。 Libero 简介 关于Lib...

whik1194的博客 3万+

【数据结构】二叉树的链式表示

参考资料:《数据结构(C语言版)严蔚敏著》 版权说明:未经作者允许,禁止转载。如引用本文内容,需标明作者及出处。如本文侵犯了您的权益,请联系我删除并致歉。 文章说明:如文章中出现错误,请联系我更改。如您对文章的内容有任何疑问,也欢迎来与我讨论。 本文正在施工中...请稍等... 二叉树的链式表示 使用链表来表示二叉树,则结点结构中至少含有3个域:数据域、左指针域和右指针域。有时,为了便于找到结...

WINGREZ‘S BLOG 2419

js逆向-逆向部分技巧总结

js逆向-逆向部分技巧总结

Deng872347348的博客 2131

26、多级快速多极子算法(MLFMA)在大规模电磁问题中的应用

本文探讨了多级快速多极子算法(MLFMA)在大规模电磁问题中的高效应用。通过分层分区策略,MLFMA在分布式内存架构上实现了高效并行化,能够求解包含数亿未知数的复杂电磁问题。文章分析了介质球体、半球透镜、周期性结构和损耗介质阵列等典型案例,验证了MLFMA的高精度与广泛适用性。同时,MLFMA被应用于实际场景如隐身目标Flamme的外部共振分析和含分裂环谐振器的超材料设计,展示了其在航空航天、超材料和生物医学等领域的广阔前景。未来发展方向包括算法优化、多物理场耦合和实时计算,进一步拓展其应用潜力。

t8u9v0w1x的博客 117

二叉树链式存储详解

二叉树是数据结构中一个非常重要的概念,它广泛应用于各种算法和程序设计中。在C语言中,我们可以使用链式存储的方式来实现二叉树。

猪肉炖粉条的博客 2569

让 ABAP 开发者也能做出高质量 SAP Fiori:到底需要掌握多少前端知识?

文章摘要: 随着SAP技术演进,ABAP开发者的角色边界正在重构。传统SAP GUI时代的全栈开发模式逐渐转向RAP+Fiori Elements的新范式,其中关键技术变化包括: 开发模式转变:从前后端耦合转向RAP模型驱动开发,通过CDS注解实现UI意图表达 分工优化:Fiori Elements模板处理80%标准UI需求,Flexible Programming Model解决20%差异化需求 效率提升:注解驱动开发可在RAP建模阶段同步定义UI结构,大幅缩短交付周期 工具整合:SAP提供从建模到部署的

2007 年 ~ 2025 年,深耕 SAP 技术 18 年 348

二叉树(链式存储)—— C++实现

作者:花 梦 时间:2019.12.21 二叉树(链式存储) 非线性 物理上不连在一起 树型结构 直接开撸,首先需要我们的头文件与命名空间: #include <iostream> #include <deque> // 下面的层级遍历的算法需要用到队列 using namespace std; 链式存储需要结点来连接左子树与右子树: template &...

浪子花梦 3575

假人有限元模型

假人模型,车辆碰撞假人有限元模型,适合做乘员安全的研究者利用

TMS_WebGMaps_1.9.8.0_Full_Source

TMS_WebGMaps_1.9.8.0_Full_Source 全源码 delphi cbuilder

【数据结构】 实验报告10 顺序、链式存储结构的二叉树递归遍历、层次遍历求高度

一、实验目的和要求 (源码在最后) 要求: 两种及以上存储结构(建议 顺序存储结构和链式存储结构各一)、两种及以上方法(建议 递归遍历和层次遍历方法各一)。分析各代码性能。 抽象数据类型(二叉树)独立模块实现。 其它要求同作业-01要求。 二、实验环境 软件环境:visual stdio 2017 硬件环境:①CPU:Intel(R)Core(TM)i7-8565U CPU @1.80Ghz ...

RealCoder的博客 3481

jre9下载 jdk9

(Java SE Runtime Environment 9.0) 9.0u175 官方最新版 【x86|x64】

二叉树链式结构

typora-copy-images-to: upload 文章目录前言二叉树的链式结构二叉树的遍历方式前序遍历中序遍历后序遍历二叉树前中后序遍历练习前序遍历练习中序遍历练习后序遍历练习利用前序遍历中序遍历结合二叉树其他操作二叉树结点个数二叉树叶子结点个数二叉树第K层节点个数二叉树查找值为x的节点二叉树的高度二叉树的层序遍历 前言 上一章讲到二叉树的顺序结构实现以及运用,而此篇文章是为了讲解二叉树的链式结构以及相关运用. 二叉树的链式结构 如果想用链式结构进行实现二叉树,那么一定少不了左右指针(指.

m0_51723227的博客 2116

C# WinForm 基于DirectShow.dll编写的程序,可边预览边保存视频,音频和图片

基于微软的DirectShow.dll的二次开发1.自动识别连接的摄像头跟麦克风且可以对其进行选择(默认选中第一个)2.可录制wmv和avi两种格式的视频并且都带有音频,avi可以录制的分辨率和帧数进行选择,wmv默认进行了淸晰度优化如不喜欢可去除代码中有相关提示3.可在预览点开之后进行拍照,也可边录制视频边拍照4.添加了视频和音频的压缩功能(酌情使用)这次二次开发发现C#对DirectShow的相关信息太少,这次做完也不敢藏私共享出来,还望大家指正

【链式二叉树】数据结构链式二叉树的(万字详解)

链式二叉树的详解

m0_56069910的博客 1405

【数据结构】用最简洁的内容带你了解二叉树的链式结构

数据结构中二叉树的链式结构相关知识点分享

2301_80191662的博客 1138

【二叉树】链式结构的一些操作实现

✨目录1.二叉树链式结构的实现从概念中可以看出,二叉树定义是递归式的,因此后序基本操作中基本都是按照该概念实现的二叉树的链式结构在代码中的定义2.二叉树的遍历。

记录学习点滴 627
上一篇: C++实现循环队列和链式队列操作(实验5--作业)
下一篇: 哈夫曼树及应用(实验7--作业)
ByteMaster_
博客等级 码龄3年 328粉丝 29原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值