数据结构-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

用Python+LLM实现小说自动转剧本:从爬取到生成的完整实战指南(附GitHub源码)

本文提供了一份完整的实战指南,详细介绍了如何利用Python和大语言模型(LLM)构建一个自动化的小说转剧本工具。文章从网络爬虫获取文本开始,逐步讲解了使用LLM进行智能解析与结构化、集成专业模型进行情绪分析与动作生成,最终合成并输出格式规范的剧本文档。通过模块化架构设计和附带的GitHub源码,帮助开发者掌握从数据获取到内容生成的全流程,实现高效的小说剧本转换器。

xray4的博客 419

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

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

qq_57822260的博客 287

主流双目相机技术参数横向评测:从ZED到INDEMIND的深度解析

本文对主流双目相机进行了深度横向评测,涵盖ZED、Bumblebee、Leap Motion、DUO 3D及INDEMIND等国内外产品。文章详细解析了分辨率、帧率、视场角、基线等核心参数,并结合科研、机器人导航、无人机、工业检测等典型应用场景,提供了实战选型指南,帮助读者根据具体需求挑选最合适的双目视觉解决方案。

weixin_29212867的博客 642

18.EC实战 新建项目工程并配置各个引脚的工作方式(持续更新)

本博文介绍了从零开始新建EC工程及对各个引脚进行了工作模式的初始化配置

qq_30135687的博客 1732

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

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

qq_61649579的博客 317

MTK(基础篇)ROM烧录以及分区的作用

本文介绍了MTK芯片设备的刷机流程及关键分区功能。首先通过MTK烧录工具加载ROM文件(包括引导文件和分区表),重点解析了各分区的核心作用:preloader类似BIOS负责硬件初始化;lk作为二级引导程序加载内核;vbmeta验证系统完整性;boot包含Linux内核;dtbo调整硬件配置;modem管理通信功能;tee保护生物识别数据;system/vendor分别存放系统核心和硬件驱动。特别指出preloader、vbmeta等关键分区损坏会导致设备变砖,而recovery分区是重要的救砖入口。全文简

weixin_49303682的博客 445

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

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

2301_80301467的博客 413

DeepSeek赋能公文写作指南(一)

DeepSeek 的出现,为公文写作领域带来了新的曙光。作为先进的人工智能技术,DeepSeek 以其强大的语言理解与生成能力,能为公文写作提供全方位的支持。它可以快速梳理思路,提供丰富的素材参考,辅助优化语言表达,甚至能根据不同的公文类型和场景,生成极具价值的内容框架。《DeepSeek 赋能公文写作指南》正是基于此背景应运而生。本书旨在帮助公文写作者深入了解并充分利用 DeepSeek 这一强大工具,将其融入到公文写作的各个流程中。

通俗易懂学IT 5486

基石篇:多模态数据工程导论与核心概念

多模态数据工程不是写Python脚本处理几张图片,而是设计并构建一套系统,来规模化地生产高质量、可追溯、符合合规要求的模型就绪数据。本文将为你建立正确的数据工程思维框架,明确其在多模态AI生态中的战略地位,并为后续的深入学习奠定坚实基础。

jiaquan3011的博客 629

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

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

萌新的博客 2748

计算机组成原理(第三版)唐朔飞-第六章计算机的运算方法-课后习题(17-32)

计算机组成原理(第三版)唐朔飞-第六章计算机的运算方法-课后习题(17-32)

weixin_45735391的博客 12万+

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

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

cjejwe的博客 1719

lwip-2.0.3

lwip是瑞典计算机科学院(SICS)的Adam Dunkels 开发的一个小型开源的TCP/IP协议栈。实现的重点是在保持TCP协议主要功能的基础上减少对RAM 的占用。

温度PID控制PLC程序

温度PID稳定控制程序,适用于欧姆龙PLC,对其他PLC也具有很大参考价值

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

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

Zichel77的博客 3785

ET2012新版免狗免安装绿色软件

ET2012新版免狗免安祖昂绿色软件。,新界面,新视觉,

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

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

Lucky_追梦仔的博客 4435

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

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

二叉树构建与遍历全解析

本文介绍了二叉树的构建和遍历方法。首先,通过单个序列(如前序、中序、后序)构建二叉树时,需使用特殊符号(如#)作为终止符,并注意递归调用时的指针问题,可通过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、付费专栏及课程。

余额充值