二叉树构建和三种遍历算法实现等【数据结构-朱战立】

(数据结构)二叉树的建立与遍历 提示:文章写完后,目录可以自动生成,如何生成可参考右边的帮助文档 文章目录 前言 在学习了二叉树之后,对二叉树的概念还处于比较懵的状态,下面就一项实验报告来具体实现二叉树,目的是为了掌握二叉树的定义,并且实现二叉树的链式存储结构以及在链式存储结构中的三种遍历(前序、中序、后序)。 提示:以下是本篇文章正文内容,下面案例可供参考 一、什么是二叉树? 二叉树(binary tree)是一个有限的结点集合,这个集合或则为空,或则由一个根结点和两颗互不相交的称为左子树(left subt. 阅读详情
/*2018年8月19日 16:55:56*/
/*构建一个二叉树函数*/
#include <stdio.h>
#include <malloc.h>
#include <stdlib.h>
typedef char DataType;
typedef struct tree{

	DataType data;
	struct tree *left;
	struct tree *right;
}TreeNode;


/*二叉树初始化函数*/
void TreeInit(TreeNode **root)
{
	if ((*root=(TreeNode *)malloc(sizeof(TreeNode)))==NULL)
	{
		printf("-error-");
		getchar();
		exit(1);
	}
	(*root)->left = NULL;
	(*root)->right = NULL;
}

/*二叉树左子节点插入*/
int *TreeLeftNode(TreeNode *pLeft, DataType x)
{
	TreeNode *pre, *temp;

	if (pLeft==NULL)
	{
		return NULL;
	}

	temp = pLeft->left;  //保存原节点的左子树指针
	pre = (TreeNode*)malloc(sizeof(TreeNode));//开辟pre的内存空间
	pre->data = x;      //将数字插入节点数据储存中
	pre->left = temp;//将原树的左子树指针赋值给新节点的左子树指针
	pre->right = NULL; //将新节点右子树设为空;

	pLeft->left = pre; //新节点成为左子树;
	return pLeft->left;  //2018年8月19日 21:03:12  返回左子树指针
}


/*二叉树右子节点插入*/
int *TreeRightNode(TreeNode *pRight, DataType x)
{
	TreeNode *pre, *temp;

	if (pRight == NULL)
	{
		return NULL;
	}

	temp = pRight->right;
	pre = (TreeNode*)malloc(sizeof(TreeNode));//开辟pre的内存空间
	pre->data = x;
	pre->right = temp;

	pre->left = NULL;
	pRight->right = pre;
	return pRight->right;   //2018年8月19日 21:02:49  返回右子树指针
}


/*二叉树左子节点删除*/
int *TreeLeftDel(TreeNode *dLeft)
{
	if (dLeft==NULL||dLeft->left==NULL)
	{
		return NULL;
	}
	free(dLeft->left);
	dLeft->left = NULL;
	return dLeft;
}

/*二叉树右子节点删除*/
int *TreeRightDel(TreeNode *dright)
{
	if (dright==NULL||dright->right==NULL)
	{
		return NULL;
	}
	free(dright->right);
	dright->right = NULL;
	return dright;
}


/*递归撤销链表的函数*/
void Destroy(TreeNode **tree)
{
	if ((*tree) != NULL && (*tree)->left != NULL)
	{
		Destroy(&(*tree)->left);
	}
	if ((*tree) != NULL && (*tree)->right != NULL)
	{
		Destroy(&(*tree)->right);
	}
	free(*tree);
}

/*通过递归实现遍历*/
void Visit(DataType item)
{
	printf("%c->",item);
}

/*前序遍历*/
void FrontOrder(TreeNode *tree, void Visit(DataType item))
{
	if (tree!=NULL)
	{
		Visit(tree->data);
		FrontOrder(tree->left, Visit);
		FrontOrder(tree->right, Visit);
	}
}

/*中序遍历*/
void BetweenOrder(TreeNode *tree, void Visit(DataType item))
{
	if (tree!=NULL)
	{
		BetweenOrder(tree->left, Visit);
		Visit(tree->data);
		BetweenOrder(tree->right, Visit);
	}
}

/*后续遍历*/
void LastOrder(TreeNode *tree, void Visit(DataType item))
{
	if (tree != NULL)
	{
		BetweenOrder(tree->left, Visit);
		BetweenOrder(tree->right, Visit);
		Visit(tree->data);
	}
}

/*打印函数*/
void PrintBiTree(TreeNode *tree, int num) //其中num是层数
{
	int i;
	if (tree==NULL)
	{
		return;
	}
	PrintBiTree(tree->right, num + 1);
	/*访问根节点*/
	for ( i = 0; i < num-1; i++)
	{
		printf("   ");
	}
	if (num>0)
	{
		printf("----");
		printf("%c\n", tree->data);
	}
	PrintBiTree(tree->left, num + 1);
}

/*二叉树查找函数*/
TreeNode *Serach(TreeNode *tree, DataType x)
{
	TreeNode *pre;

	if (tree==NULL)
	{
		return NULL;
	}
	if (tree->data==x)
	{
		return tree;
	}
	if (tree->left!=NULL)
	{
		pre=Serach(tree->left, x);
		if (pre!=NULL)
		{
			return pre;
		}
	}
	if (tree->right != NULL)
	{
		pre=Serach(tree->right, x);
		if (pre != NULL)
		{
			return pre;
		}
	}
	return NULL;
}

/*主函数*/

int main()
{
	TreeNode *root,*p,*pp;

	TreeInit(&root);
	p = TreeLeftNode(root, 'A');
	p = TreeLeftNode(p, 'B');
	p = TreeLeftNode(p, 'D');
	p = TreeRightNode(p, 'G');
	p = TreeRightNode(root->left, 'C');
	pp = p;
	TreeLeftNode(p, 'E');
	TreeRightNode(pp, 'F');

	PrintBiTree(root, 0);

	printf("前序遍历:\n");
	FrontOrder(root->left, Visit);
	printf("\n中序遍历:\n");
	BetweenOrder(root->left, Visit);
	printf("\n后序遍历:\n");
	LastOrder(root->left, Visit);

	Destroy(&root);  //2018年8月19日 20:40:34 注意这里输出型
	printf("\n");
	system("pause");
	return 0;
}

 

【嵌入式开发之数据结构】树的基本概念、逻辑结构和四种常用的遍历算法及实现 树是一种常用的非线性结构,不同的遍历算法将产生不同的结果,可以满足不同的需要。 阅读详情

相关推荐

二叉树的4种遍历算法

遍历二叉树可以算作是对树存储结构做的最多的操作,既是重点,也是难点。本节将从初学者的角度给大家分析一下 4 种遍历二叉树算法的由来。

数据结构和算法教程(C语言版) 1235

二叉树的存储结构和二叉树的遍历方法以及实现代码

实现代码在上述代码段中,函数为 PostOrder1(BiTree TT)、InOrder1(BiTree TT)、PreOrder1(BiTree TT);如果二叉树如下图中所示,补全节点使其成为完全二叉树的方法太浪费空间;给定一个序列,在给定一个遍历的方法,能否将还原出二叉树呢?下图中的左右 要理解为树木,不要片面的理解成节点;答案是:不能,如下图,给定先序遍历 123。先看动图看遍历步骤,再看实例;先序遍历序列+中序遍历序列。后序遍历序列+中序遍历序列。层次遍历序列+中序遍历序列。

qq_51141456的博客 2298

实现二叉树的各种遍历算法

先建立一棵二叉树,然后用递归算法实现二叉树的前序、中序和后序遍历;用层次遍历算法实现二叉树遍历。

数据结构实验

编写程序实现顺序表的各种基本运算。对给定字符数组a[]={‘1’,‘2’,‘3’,‘1’,‘1’,‘0’,‘4’,‘2’,‘3’,‘1’,‘0’,‘4’,‘2’},创建顺序表L,删除从’2’到’3’的元素。要求时间复杂度为O(n),空间复杂度为O(1)。 可以输入一个任意大小的迷宫数据,用非递归的方法(栈或队列)求出一条走出迷宫的路径,并将路径输出; 二叉树遍历算法及其应用 以二叉链表存储结构的方式创建如下图的二叉树,输入时将下图二叉树变为基于括号表示的字符串。创建二叉树和实现二叉树的三种遍历和层次遍

定期分享我的发现和想法,感谢你的陪伴和支持 7643

二叉树的实现各种遍历算法

二叉树的实现各种遍历算法,插入删除成员函数非常全。二叉树的实现各种遍历算法,插入删除成员函数非常全

C语言实现二叉树的三种遍历优化

C语言实现二叉树的三种遍历优化版本,经过小编的测试无bug,完全可以使用。优于上一个二叉树的遍历算法!

数据结构与算法 实验二 二叉树的建立与遍历算法(C语言版)

实验目的: 1、掌握二叉树的定义。 2、二叉树的链式存储结构及在链式存储结构中三种遍历(前序,中序,后序)操作的实现及应用。 实验内容: 编写程序,实现以下功能: (1)建立一棵二叉树(以链表存储),对该二叉树进行遍历并输出该二叉树的前序,中序,后序遍历序列。要求前序、中序遍历用非递归方法,后序遍历用递归方法完成。 (2)实现二叉树左右子树的交换。 (3)统计二叉树中叶子结点个数。(要求用非递归算法完成) 基本要求: 1、写出完成实验内容的实验方法和源代码。 2、写出实验数据及运行结果。

weixin_64234293的博客 5699

数据结构实验 二叉树的遍历方法

一、实验名称:二叉树的遍历方法 二、实验目的: (1)熟悉C语言的上机环境,进一步掌握C语言的结构特点; (2)掌握二叉树的储存结构的定义及C语言实现; (3)掌握二叉树的三种遍历方法,即先序遍历,中序遍历,后序遍历; (4)实现递归到非递归方法的转变; 三、实验内容: 建立一棵用二叉树链表方式存储的二叉树,并对其进行遍历(先序遍历,中序遍历,后序遍历),打印遍历结果。 要求:从键盘输入先序序列,以二叉链表作为存储方式,建立二叉树实现遍历,采用递归和非递归的两种方法实现。

【数据结构】 二叉树及其三种遍历

二叉树(Binary Tree)一种重要的树形结构,其每个节点最多只能有两棵子树,通常称为左子树和右子树,且子树有左右之分,其次序不能颠倒。二叉树是n个有限元素的集合,该集合或者为空(称为空二叉树),或者由一个称为根(root)的元素及两个不相交的、被分别称为左子树和右子树的二叉树组成。

这里是阿安的博客 21万+

二叉树建立及遍历算法实现

建立二叉树,实现二叉树的先序、中序、后序的递归遍历算法,输出遍历结果。 实现二叉树的先序、中序、后序和层次遍历的非递归算法,输出遍历结果。

用Python对CAPM和Fama French Three Factor model的初步学习

用Python对CAPM和Fama French Three Factor model的初步学习概述介绍建模与分析CAPMFama French Three-Factor Model总结 概述 本文主要使用CAPM(资本资产定价模型)和Fama French Three Factor model来评估中国股票市场的股票价格。 使用CAPM来选择投资组合,然后建立Fama法国三因素模型来评估投资组合...

weixin_43168138的博客 5459

实现二叉树各种遍历算法

/** *    实验题目: *        实现二叉树各种遍历算法 *    实验目的: *        领会二叉树的各种遍历过程以及遍历算法设计 *    实验内容: *        设计程序,实现二叉树的先序遍历、中序遍历和后序遍历的 *    递归和非递归算法,以及层次遍历的算法。 */ #include &lt;stdio.h&gt; #include &lt;malloc.h&...

xiezhi123456的博客 9535

LaTeX公式转Word竟这么简单?Python三行代码实现学术论文格式无忧

本文介绍如何利用Python的latex2word库,仅需三行代码即可将LaTeX数学公式精准转换为Word原生Office Math对象,解决学术写作中LaTeX与Word格式割裂的难题。该方法支持批量处理、格式保真,并能与Markdown、Jupyter Notebook等工具集成,构建自动化写作流程,实现学术论文格式无忧。

qsc90123456的博客 296

数据结构——二叉树的递归遍历算法与非递归遍历算法+层次遍历算法

数据结构中二叉树的递归与非递归遍历算法(先序、中序、后序)+层次遍历算法分析与实现。 数据结构二叉树的遍历算法!!!

mcr1379673758的博客 4856

VSCode玩转ESP-ADF音频开发:从环境搭建到成功播放MP3的避坑全流程

本文详细介绍了如何在VSCode环境下使用ESP-ADF框架进行ESP32音频开发,从环境搭建到成功播放MP3的全流程。重点解析了`IDF_PATH`和`ADF_PATH`的配置问题,以及如何解决`xTaskCreateRestrictedPinnedToCore`等常见编译错误,帮助开发者快速上手ESP-ADF音频开发。

weixin_42520909的博客 339

Zynq工程IP核封装:XCI引用与约束继承实战指南

IP核封装是FPGA系统设计中实现模块复用、团队协作与技术资产沉淀的关键环节。其本质是将功能逻辑、时序约束、接口协议和硬件配置统一抽象为可配置、可验证、可演进的标准化组件。核心原理在于通过XCI文件保留IP核的参数化定义能力,依托Vivado IP Packager实现约束继承、端口自动映射与时钟域解耦,从而保障跨项目集成的时序可信性与约束完备性。该技术广泛应用于Zynq SoC视频处理、高速接口(如HDMI/TMDS)、多时钟域控制系统等场景,尤其在需要长期维护与版本迭代的工业级嵌入式开发中具有不可替代的

weixin_42593701的博客 124

Python算法系列—深度优先遍历算法【二叉树】

深度优先遍历算法之二叉树一、什么是深度优先遍历二、二叉树1. 二叉树简介2.二叉树类型3.二叉树相关术语4. 二叉树的节点代码5. 二叉树遍历顺序6.深度优先遍历和广度优先遍历三、面试题+励志 ``这不就是二叉树吗?嗯,风景都在提示我该学学二叉树了``` 一、什么是深度优先遍历 深度优先遍历算法是经典的图论算法。从某个节点v出发开始进行搜索。不断搜索直到该节点所有的边都被遍历完,当节点v所有的边...

TianYao 7923

手把手教你学Simulink——基于Simulink的前馈解耦SVPWM整流器仿真

本文详细介绍了基于Simulink的前馈解耦SVPWM整流器仿真方法。针对三相PWM整流器存在的dq轴交叉耦合问题,提出前馈解耦控制方案,通过在电流环中引入耦合电压补偿项,显著提升系统性能。文章包含完整的系统架构、核心算法、Simulink建模步骤及参数设置,仿真结果显示:电流跟踪误差<2%、动态响应时间<0.05s、THD<3%、功率因数>0.999。同时提供了可直接复用的MATLAB代码和工程优化建议,为电力电子工程师实现高精度AC/DC转换提供了实用解决方案。

MHD0815的博客 108

017-二叉树的遍历算法

二叉树遍历算法摘要 本文系统介绍了二叉树的遍历算法,包括前序、中序、后序和层序遍历。主要内容有: 遍历概述:二叉树遍历是按照特定顺序访问所有节点的过程,分为深度优先(前序、中序、后序)和广度优先(层序)两类。 遍历实现:详细讲解了递归和非递归两种实现方式,其中非递归实现使用栈结构模拟递归调用。 遍历特点:前序遍历适合复制树结构,中序遍历对二叉搜索树可得到有序序列,后序遍历常用于释放树内存。 代码示例:提供了Python实现代码,包括节点定义、树结构创建和四种遍历算法的具体实现,并附有详细的执行过程说明。 应

wyl703的博客 2138

Python 爬虫实战:付费 IP 代理使用技巧与爬虫稳定性优化

付费IP代理实战指南:突破反爬与优化稳定性 本文系统讲解付费IP代理在爬虫项目中的高效应用方法。首先对比分析静态代理、动态代理和隧道代理的优缺点及适用场景,推荐高并发项目优先选择隧道代理。然后详细演示了主流代理服务商的集成方法,包括代理池的自动更新和健康检测机制。核心部分重点介绍了爬虫稳定性优化策略,如智能重试、频率控制和请求间隔优化等关键技术。最后通过压力测试验证优化效果,并提供成本控制方案,包括代理复用、错峰爬取等实用技巧。通过本教程,开发者可有效解决高并发爬虫中的IP封禁问题,显著提升系统稳定性和抗风

2503_91057718的博客 2450

【YoloV11改进策略】基于流形约束超连接(mHC)增强YoloV11全局特征提取能力|独家复现|梁文峰署名论文

论文标题:流形约束超连接 (Manifold-Constrained Hyper-Connections, mHC)核心问题:针对超连接 (Hyper-Connections, HC) 扩展残差流宽度时破坏恒等映射、引发训练不稳定性和高内存开销的问题,提出一种约束性框架。目标:恢复残差连接的稳定性与可扩展性,同时保持HC的性能增益。基准模型:基于DeepSeek-V3的MoE架构,进行了3B、9B、27B模型的实验验证。论文图示mHC 是一个通用的HC扩展框架。

m0_47867638的博客 1349

二叉树的四种遍历算法

二叉树作为一种重要的数据结构,它的很多算法的思想在很多地方都用到了,比如STL算法模板,里面的优先队列、集合等等都用到了二叉树里面的思想,先从二叉树的遍历开始: 看二叉树长什么样子: 我们可以看到这颗二叉树一共有七个节点 0号节点是根节点 1号节点和2号节点是0号节点的子节点,1号节点为0号节点的左子节点,2号节点为0号节点的右子节点 同时1号节点和2号节点又是3号节点、四号节点和五号节点、6号节点的双亲节点 五号节点和6号节点没有子节点(子树),那么他们被称为‘叶子节点’ 这就是一些基本

bobozai86的博客 1万+

文档:亲测可用解决vnc灰屏,黑屏,鼠标大黑叉情况

主要解决vnc-viewer灰屏,黑屏,鼠标大黑叉等现象,详细见文档。

数据结构实验——实现二叉树的各种遍历算法

PostOrder1(BTNode *b):二叉树b的后序遍历的非递归算法。· PreOrderl(BTNode *b):二叉树b的先序遍历的非递归算法。· PostOrder(BTNode *b):二叉树b的后序遍历的递归算法。· PreOrder(BTNode *b):二叉树b的先序遍历的递归算法。· InOrderl(BTNode*b):二叉树b的中序遍历的非递归算法。· InOrder(BTNode*b):二叉树b的中序遍历的递归算法。算法:其中包含如下函数。

u014114223的博客 1348

Camera2Demo

在Camera2 的基础上进行封装,使得Camera2一堆初始化逻辑与Activity分离,降低耦合度,完成预览拍照并保存的操作

efm32 入门.pdf

本PDF共计22页,介绍的是操作驱动API,下载与否自己斟酌。

数据结构 第七章 实验题2 实现二叉树的各种遍历算法

实验题目: 实现二叉树各种遍历算法 实验目的: 领会二叉树的各种遍历过程以及遍历算法设计 实验内容: 设计程序,实现二叉树的先序遍历、中序遍历和后序遍历的 递归和非递归算法,以及层次遍历的算法。 整个实现步骤: 二叉树各种运算的定义 以二叉树结点为元素的栈的定义(由于非递归的遍历算法需要) 以二叉树结点为元素的循环队列的定义(由于层次遍历需要...

解忧小屋 9658
上一篇: 计算递归次数【数据结构-朱战立】
下一篇: 快速排序算法【数据结构-郝斌】
蓝莓派Alex
博客等级 码龄15年 147粉丝 49原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值