数据结构-6.1二叉树的构建与遍历

6.1: 二叉树的构建与遍历 引言 树是一种比较重要的数据结构,尤其是二叉树。在这里简单介绍二叉树。 二叉树是一种特殊的树,在二叉树中每个节点最多有两个子节点,一般称为左子节点和右子节点(或左孩子和右孩子),并且二叉树的子树有左右之分,其次序不能任意颠倒。 1. 二叉树的定义 二叉树是n(n>=0)个结点的有限集合,该集合或者为空集(称为空二叉树),或者由一个根结点和两棵互不相交的、分别称为根结点的左子树和右子树组成。 2. 二叉树的遍历 二叉树的存储分为顺序存储和链式存储。顺序存储在右斜树这种极端情况下,会十分浪费. 阅读详情

1.二叉树的构建与遍历实现

代码如下(示例):

#include <stdio.h>
#include <stdlib.h>
#include <stdbool.h>
#include <malloc.h>

#define QUEUE_SIZE 5

typedef struct BTNode {
	char element;
	struct BTNode* left;
	struct BTNode* right;
}BTNode, *BTNodePtr;

typedef struct BTNodePtrQueue {
	BTNodePtr* nodePtrs;
	int front;
	int rear;
}BTNodePtrQueue, *QueuePtr;

QueuePtr initQueue() {
	QueuePtr resultQueuePtr = (QueuePtr)malloc(sizeof(struct BTNodePtrQueue));
	resultQueuePtr->nodePtrs = (BTNodePtr*)malloc(QUEUE_SIZE * sizeof(BTNodePtr));
	resultQueuePtr->front = 0;
	resultQueuePtr->rear = 1;
	return resultQueuePtr;
}

bool isQueueEmpty(QueuePtr paraQueuePtr) {
	if ((paraQueuePtr->front + 1) % QUEUE_SIZE == paraQueuePtr->rear) {
		return true;
	}

	return false;
}

void enqueue(QueuePtr paraQueuePtr, BTNodePtr paraBTNodePtr) {
	printf("front = %d, rear = %d,.\r\n", paraQueuePtr->front, paraQueuePtr->rear);
	if ((paraQueuePtr->rear + 1) % QUEUE_SIZE == paraQueuePtr->front % QUEUE_SIZE) {
		printf("Error ,trying to enqueue %c. queue full.\r\n", paraBTNodePtr->element);
		return;
	}
	paraQueuePtr->nodePtrs[paraQueuePtr->rear] = paraBTNodePtr;
	paraQueuePtr->rear = (paraQueuePtr->rear + 1) % QUEUE_SIZE;
	printf("enqueue %c ends.\r\n", paraBTNodePtr->element);
}

BTNodePtr dequeue(QueuePtr paraQueuePtr) {
	if (isQueueEmpty(paraQueuePtr)) {
		printf("error, empty queue\r\n");
		return NULL;
	}

	paraQueuePtr->front = (paraQueuePtr->front + 1) % QUEUE_SIZE;
	
	printf("dequeue %c ends.\r\n", paraQueuePtr->nodePtrs[paraQueuePtr->front]->element);
	return paraQueuePtr->nodePtrs[paraQueuePtr -> front];
}

BTNodePtr constructBTNode(char parachar) {
	BTNodePtr resultPtr = (BTNodePtr)malloc(sizeof(BTNode));
	resultPtr->element = parachar;
	resultPtr->left = NULL;
	resultPtr->right = NULL;
	return resultPtr;
}

BTNodePtr stringToBTree(char* paraString) {
	int i;
	char ch;

	QueuePtr tempQueuePtr = initQueue();

	BTNodePtr resultHeader;
	BTNodePtr tempParent, tempLeftChild, tempRightChild;
	i = 0;
	ch = paraString[i];
	resultHeader = constructBTNode(ch);
	enqueue(tempQueuePtr, resultHeader);

	while (!isQueueEmpty(tempQueuePtr)) {
		tempParent = dequeue(tempQueuePtr);

		i++;
		ch = paraString[i];
		if (ch == '#') {
			tempParent->left = NULL;
		}
		else {
			tempLeftChild = constructBTNode(ch);
			enqueue(tempQueuePtr, tempLeftChild);
			tempParent->left = tempLeftChild;
		}


		i++;
		ch = paraString[i];
		if (ch == '#') {
			tempParent->right = NULL;
		}
		else {
			tempRightChild = constructBTNode(ch);
			enqueue(tempQueuePtr, tempRightChild);
			tempParent->right = tempRightChild;
		}
	}

	return resultHeader;
}

void levelwise(BTNodePtr paraTreePtr) {
	char tempString[100];
	int i = 0;
	QueuePtr tempQueuePtr = initQueue();
	BTNodePtr tempNodePtr;
	enqueue(tempQueuePtr, paraTreePtr);
	while (!isQueueEmpty(tempQueuePtr)) {
		tempNodePtr = dequeue(tempQueuePtr);

		tempString[i] = tempNodePtr->element;
		i++;

		if (tempNodePtr->left != NULL) {
			enqueue(tempQueuePtr, tempNodePtr->left);
		}
		if (tempNodePtr->right != NULL) {
			enqueue(tempQueuePtr, tempNodePtr->right);
		}
	}
	tempString[i] = '\0';

	printf("Levewise: %s\r\n", tempString);
}

void preorder(BTNodePtr tempPtr) {
	if (tempPtr == NULL) {
		return;
	}

	printf("%c", tempPtr->element);
	preorder(tempPtr->left);
	preorder(tempPtr->right);
}

void inorder(BTNodePtr tempPtr) {
	if (tempPtr == NULL) {
		return;
	}

	inorder(tempPtr->left);
	printf("%c", tempPtr->element);
	inorder(tempPtr->right);
}

void postorder(BTNodePtr tempPtr) {
	if (tempPtr == NULL) {
		return;
	}

	postorder(tempPtr->left);
	postorder(tempPtr->right);
	printf("%c", tempPtr->element);
}

int main()
{
	BTNodePtr tempHeader;
	tempHeader = constructBTNode('c');
	printf("There is only one node. Preorder visit: ");
	preorder(tempHeader);
	printf("\r\n");

	char* tempString = "acde#bf######";

	tempHeader = stringToBTree(tempString);
	printf("preorder: ");
	preorder(tempHeader);
	printf("\r\n");
	printf("inorder: ");
	inorder(tempHeader);
	printf("\r\n");
	printf("postorder: ");
	postorder(tempHeader);
	printf("\r\n");
	printf("levelwise: ");
	levelwise(tempHeader);
	printf("\r\n");

	return 1;
}

2.结果输出

代码如下(示例):

There is only one node. Preorder visit: c
front = 0, rear = 1,.
enqueue a ends.
dequeue a ends.
front = 1, rear = 2,.
enqueue c ends.
front = 1, rear = 3,.
enqueue d ends.
dequeue c ends.
front = 2, rear = 4,.
enqueue e ends.
dequeue d ends.
front = 3, rear = 0,.
enqueue b ends.
front = 3, rear = 1,.
enqueue f ends.
dequeue e ends.
dequeue b ends.
dequeue f ends.
preorder: acedbf
inorder: ecabdf
postorder: ecbfda
levelwise: front = 0, rear = 1,.
enqueue a ends.
dequeue a ends.
front = 1, rear = 2,.
enqueue c ends.
front = 1, rear = 3,.
enqueue d ends.
dequeue c ends.
front = 2, rear = 4,.
enqueue e ends.
dequeue d ends.
front = 3, rear = 0,.
enqueue b ends.
front = 3, rear = 1,.
enqueue f ends.
dequeue e ends.
dequeue b ends.
dequeue f ends.
Levewise: acdebf

总结

       首先写出构建结点和队列的数据结构,然后写出入队,出队的函数,出队返回值为队列的头指针地址,constructBTNode()将输入的字符串的字符给纳入结点element之中,然后StringToBTree()把队列中的元素用left,right指针连接起来构成二叉树,levelwise()函数对二叉树进行层次遍历,后面的preorder(),inorder(),postorder()是对前中后序输出。
C++实现根据二叉树的前序遍历与中序遍历构建二叉树 在记录题目解法之前,首先记录一下有关二叉树遍历的相关知识。二叉树的遍历分为前序遍历,中序遍历和后序遍历三种遍历方法。前序遍历的顺序为当前节点->左子节点->右子节点的顺序,中序遍历的顺序为左子节点->当前节点->右子节点的顺序,后序遍历的顺序是左子节点->右子节点->当前节点的顺序。例如如下二叉树: 前序遍历的结果为: 1,2,4,7,3,4,5,8 中... 阅读详情

相关推荐

二叉树的前序遍历与中序遍历,以及后序与中序遍历构建方法(迭代法)。

那么我们回想一下为什么,首先栈顶元素必定是刚插入过的元素,我们判断中序和栈顶无非是想确认左右节点,那么只要中序指针和栈顶不相等,就为左节点,这是为什么呢,因为先序是中左右,而中序是左中右,我们一旦选择了中,那么剩下的肯定是先会遇见左,此时只要不为中,就是左,遇到中以后说明左以及完了,此时的节点是右也是中,他是下一轮循环的始,也就是中,也是上一轮循环的末,也就是右。三个特点都不用多说了,就是根的位置不同,而左每次都在右的左边,而右也在左的右边,哈哈,好有哲理的废话。先序遍历:3,9,20,15,7;

m0_60715044的博客 1753

6-9 二叉树的遍历 (25 分)

本题要求给定二叉树的4种遍历。 函数接口定义: void InorderTraversal( BinTree BT ); void PreorderTraversal( BinTree BT ); void PostorderTraversal( BinTree BT ); void LevelorderTraversal( BinTree BT ); 其中BinTree结构定义如下: ...

qq_44985985的博客 1790

(C语言)通过对二叉树的先序和中序遍历构建该二叉树,然后输出该二叉树的层序遍历结果

题目描述    深度遍历一棵二叉树有先序,中序和后序三种方式,并且根据遍历序列能确定一棵二叉树,要唯一确定一棵二叉树至少需要两种遍历序列 先序+中序 或 后序+中序,(先序+后序无法唯一确定) 现在给定你一棵二叉树的先序和中序序列,请你构造出这棵二叉树,并且输出其层序遍历结果 输入 输入包含多组测试数据 对每组测试数据: 第一行为一个正整数n(0 第二行为这棵树的先序遍

YiMo_Fan的博客 7474

6.1 二叉树的遍历

数据结构 6.1- 二叉树的遍历 1. 递归法 2. 迭代法 3. 层序遍历

weixin_52360457的博客 735

数据结构-二叉树及其遍历

本篇文章咱们聊聊数据结构中的树,准确的说因该是只说一说二叉树以及相关的三种递归遍历、三种非递归遍历以及层次遍历。🍃二叉树 (BinaryTree) 是 n (n>0) 个结点所构成的集合,它或为空树(n-0)或为非空树,对于非空树(1) 有且仅有一个称之为根的结点:(2) 除根结点以外的其余结点分为两个互不相交的子集 TI 和 T2,分别称为 T 的左子树和右子树,且 T1 和 T2 本身又都是二叉树。🍃二叉树与树一样具有递归性质,二叉树与树的区别。

宁zz的博客 1064

二叉树的创建及其遍历

 按先序遍历的扩展序列建立二叉树的二叉链表存储结构,实现二叉树先序、中序、后序遍历的递归算法,实现二叉树中序遍历的非递归算法,实现二叉树层次遍历的非递归算法(要求使用顺序队列,调用顺序队列基本操作实现),求二叉树的深度(后序遍历)。

二叉树遍历 - 数据结构

1. 二叉树遍历 1.1 遍历算法: 1.先序遍历的递归算法定义:   若二叉树非空,则依次执行如下操作:   (1) 访问根结点;   (2) 遍历左子树;   (3) 遍历右子树。 2.中序遍历的递归算法定义:   若二叉树非空,则依次执行如下操作:   (1)遍历左子树;   (2)访问根结点;  

caoguanling2011的专栏 584

自动化学报latex模板——ctex2.4.6和ctex2.9.2直接使用步骤

自动化学报latex模板——ctex2.4.6和ctex2.9.2直接使用步骤 1.背景及问题 最近在使用自动化学报latex模板写作业时,一只对latex搞不清楚,网上关于各种版本的latex下载了一堆(比如ctex中文套装方案的各个版本及texlive+texstudio方案,中间还升级了miktex,windet等),发现都未能成功编译出来自动化学报的latex模板,反正开始头很大!!!最后终于没忍住打开了: 自动化学报官网下载模板链接,因为我就要用latex模板(不能服输!)找到的解决方案是:使用

QIANFANGshiwo的博客 7712

算法——(6.1)二叉树遍历

比如将前序遍历为例,首先把第一个结点压入栈中,这时候可以知道该栈的左右结点都没有处理,所以要把该结点出栈,然后按照右孩子、左孩子、中结点的顺序压入栈中,因为出栈的时候是相反的,然后在中结点后面在压入一个空结点,这意味着该结点的左右孩子都处理完了,下次出栈遇到null说明该结点的前面的结点都已经处理完毕,那么就可以输出该结点。1.思路分析:通过一个队列,首先将根结点入队,然后判断队列是否为空,不为空则出队,并对该结点进行处理,首先将该结点的左右结点入队,再将该结点输出。

qq_57822260的博客 287

数据获取竟如此简单——全球SRTM 90m DEM V4.1数据

SRTM(Shuttle Radar Topography Mission)是由NASA联合国际合作伙伴开展的雷达地形测绘项目,通过航天飞机搭载的合成孔径雷达系统,于2000年通过发射并接收地表反射的雷达信号,获取全球三维地形数据,这一任务填补了高精度全球地形数据的空白。而本文通过十余行的python代码,就更简单、方便地获取这些数据。

m0_38065162的博客 1401

从‘哒哒’声到静音顺滑:一文搞懂42步进电机细分控制的原理与实战(以TMC5160为例)

本文详细解析了42步进电机细分控制技术,以TMC5160为例,探讨如何通过正弦波电流调制和自适应波形整形实现静音运行。文章提供了实战配置指南,包括硬件连接、寄存器配置和调试技巧,帮助用户有效消除电机噪声,提升3D打印机、CNC机床等设备的运行效率。

weixin_42657024的博客 315

数据结构 C 代码 6.1: 二叉树的构建与遍历

学习目标:学会二叉树的构建与遍历 学习指导:帆神的代码 学习任务: 抄写代码 学习成果目录 1全部代码 2测试结果 3图解 代码说明: 二叉树的深度遍历使用了栈, 所以代码很简洁. 不使用栈的方式有相应代码数据结构 C 代码 6.x: 自己建栈实现二叉树遍历. 层次遍历用到了队列. 这次故意把究竟分配得比较少, 看循环队列是否正常复用空间. 从字符串构建二叉树也要用栈. 这里也可以看出二叉树的非压缩存储. 二叉树(Binary tree)是树形结构的一个重.

qq_61649579的博客 317

Obsidian和Typora图片路径同步终极指南:告别混乱的assets文件夹

本文详细解析了Obsidian与Typora图片路径同步的终极解决方案,通过Custom Attachment Location插件实现动态路径管理,解决了两款工具间图片兼容性问题。文章提供了从基础配置到高级应用的完整指南,帮助用户告别混乱的assets文件夹,提升工作效率。

g9h0i1的博客 826

数据结构6.1--二叉树的遍历与构建

3)层次遍历:从根节点出发,依次访问左右孩子结点,再从左右孩子出发,依次它们的孩子结点,直到节点访问完毕。在根节点入队后,其两个子节点会跟着入队,然后根节点出队,以此类推。1)该代码首先进行了一个循环队列的元素加入与删除,并在测试的时候跟踪了在删除和添加的过程中front和rear的变化,让我对循环队列的印象进一步加深。2)前序遍历:首先判断当前节点是否为空,如果为空则返回。然后递归地访问当前节点的左子树。后序遍历:首先判断当前节点是否为空,如果为空则返回。然后递归地访问当前节点的左子树。

2301_80301467的博客 413

GE Proficy Historian8.0历史数据库部署与配置全攻略

本文提供了GE Proficy Historian 8.0历史数据库的详细部署与配置指南。内容涵盖安装前的系统环境、权限与依赖检查,服务器安装的关键步骤与类型选择,采集器的安装配置与数据接入,以及客户端工具的使用与数据分析实战。旨在帮助用户规避常见陷阱,实现一次部署成功,构建稳定高效的工业数据归档平台。

silver的专栏 768

SpringBoot 整合Jasypt 实现配置文件加密读取操作详解

SpringBoot 整合Jasypt 实现配置文件加密读取操作详解

congge 4100

【数据结构】二叉树:一场关于节点与遍历的艺术之旅

前面我们说过顺序存储结构一般只适用于完全二叉树,既然顺序存储适应性不强,我们既要考虑链式存储结构了。二叉树每个节点最多有两个孩子,所以为它设计一个数据域和两个指针域是比较自然的想法,我们称这样的链表为二叉链表。

萌新的博客 2748

【ROS2】机械臂MoveIt2

navigation2 专注于移动机器人的导航与定位,处理大范围空间的底盘运动;MoveIt2 专注于机械臂的操作规划,处理多关节协同的末端执行器运动。在复合机器人(如,移动机械臂)navigation2 负责移动到目标区域,MoveIt2 负责机械臂抓取。官网:https://moveit.picknik.ai/main/index.html。

郭老二 602

入门数据结构JAVADS——如何通过遍历顺序构建二叉树

入门数据结构JAVA DS——二叉树的介绍 (构建,性质,基本操作等) (1)-优快云博客在上一篇博客中,笔者讲过,如果告诉你遍历顺序,是可以通过算法构建出二叉树的,这篇博客就是补充,笔者想具体的阐述一下 "告诉遍历顺序从而构建二叉树" 算法.

cjejwe的博客 1719

模型压缩技术:剪枝、量化与知识蒸馏实战

模型压缩技术:剪枝、量化与知识蒸馏实战,在深度学习领域,模型的性能往往与模型的规模紧密相关,更大的模型通常能学习到更复杂的模式,从而在任务中取得更好的效果。然而,随着模型规模的不断增大,其在实际应用中面临着诸多挑战,如内存占用高、计算资源需求大、推理速度慢等问题,这使得在资源受限的设备(如移动设备、嵌入式设备)上部署变得困难重重。模型压缩技术应运而生,它旨在在尽可能保持模型性能的前提下,通过各种方法减少模型的参数数量和计算量,提高模型的效率和可部署性。

不踩坑,不知道坑有多深;不总结,踩过的坑白踩。 5万+

Probability and Statistics - 4th edition

Probability and Statistics - 4th edition

数据结构——实验三 二叉树的遍历

一、【实验目的】 1、 了解二叉树的前序、中序、后序和层次序列排列; 2、 将C语言同二叉树的数据结构联系起来; 3、 掌握生成的二叉树的链表结构; 4、 掌握如何按层次输出二叉树的所有结点; 5、 掌握如何将动态二叉树转换为静态二叉链表。 二、【实验内容】 创建一个二叉树,对这棵动态二叉树进行分析,将其用静态二叉链表表示。二叉树的动态二叉链表结构中的每个结点有三个字段:dat...

Zichel77的博客 3785

android 蓝牙通讯demo

android 下蓝牙通讯demo,实现了发现蓝牙,使能蓝牙,通过蓝牙发送消息。

数据结构---由二叉树的中序遍历和后序遍历,构建二叉树

本文主要讲解如何根据二叉树的中序遍历和后序遍历,构建树。 在写PTA的钻石争霸赛时,在写最后一道题时,刚开始需要根据二叉树的中序遍历和后序遍历,构建二叉树,然后才能继续写题。经过当时向学长学习之后,也完成了那道题。今天写了PTA–L2-006 树的遍历这道题,发现这个算法知道原理之后,也很简单。 本文分为两个部分 中序遍历与后序遍历的关系 利用中序遍历和后序遍历构建树 1.中序遍历与后序遍历的关系 中序遍历: 先遍历左子树,在遍历根节点,最后遍历右子树。 后序遍历: 先遍历左子树,再遍历右子树,.

Lucky_追梦仔的博客 4435

精雕软件(JDpaint) 5.5 绿色版

精雕软件(JDpaint) 5.5 绿色版精雕软件(JDpaint) 5.5 绿色版精雕软件(JDpaint) 5.5 绿色版

怀旧版电脑GBC模拟器

再现原版GBC掌机的界面,电脑运行连游戏界面都一样大小,很怀旧,很真实,(英文版)强烈推荐,很小的文件,很难才找到的。

二叉树构建与遍历全解析

本文介绍了二叉树的构建和遍历方法。首先,通过单个序列(如前序、中序、后序)构建二叉树时,需使用特殊符号(如#)作为终止符,并注意递归调用时的指针问题,可通过C++引用操作符或静态成员解决。其次,利用两个序列(如前中序、后中序)构建二叉树时,前序或后序序列的第一个元素为根节点,中序序列用于确定左右子树。接着,详细讲解了二叉树的前序、中序、后序遍历的递归和非递归实现,非递归方法借助栈实现。最后,介绍了基于广度优先的层序遍历及其变种(正S与倒S遍历),通过队列或双栈实现。

2301_80253651的博客 1171

数据结构——二叉树的遍历与应用

描述了关于二叉树的遍历问题以及通过递归遍历来求二叉树的节点个数,层节点个数等问题

fax_player的博客 1860
上一篇: 数据结构3.7--循环队列
下一篇: 数据结构-6.3N后问题
dev_cc_
博客等级 码龄3年 41粉丝 16原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值