二叉树的建立及三种遍历方式c++语言实现

C++实现二叉树的创建以及四种遍历方式(递归与非递归) C++实现二叉树的创建以及四种遍历方式(递归与非递归) 语言这个东西不用真的会忘, 我记得前前后后C++的基本语法我也看了好几遍了,一直没有动手写过什么东西,所以一遍遍的看,一遍遍的忘… … 正好最近在看数据结构,想着自己用C++来实现一下,一方面是熟悉整个逻辑过程,加深对数据结构的理解,另一方面,也熟悉一下C++。 下图是我们要创建的二叉树,其中的#代表空字符; 为了验证我们程序的正确性,现给出此二叉树的四种遍历结果: 前序遍历(Preorder traversal): A B C D E F 阅读详情

早上写了二叉树的代码,树这一节基本的东西就全完了.

在阅读程序之前,建议先阅读严蔚敏的数据结构(c语言版)第6章 , 因为代码的实现是基于算法6.1  算法6.3     算法6.4

我们构造P129页的图6.9的二叉树

其中,中序遍历采用非递归方式,借助于栈实现了遍历,  后续和先序遍历使用递归方式.

在构造二叉树时 , 采用先序的顺序构造它.

我们给出要构造的二叉树 , 可以在P129页图6.9找到.

要构造先序顺序 ,  依次输入的值为:

- + a 0 0 * b 0 0 - c 0 0 d 0  0 / e 0 0 f 0 0

这里  0 代表空节点 ,也就是没有左孩子或又孩子.或空节点.

代码如下:

#include<iostream>
#include<stdlib.h> 
#define STACK_INIT_SIZE 100
#define STACKINCREMENT 10 
using namespace std;

typedef  struct BiTNode
{
	char  data;
	struct BiTNode *lchild , *rchild;  //左右孩子指针 
} BiTNode , *BiTree;

bool  CreateBiTree(BiTree &T)
{
	//按先序序列输入二叉树中的节点值,空格代表空字符 
	char ch; //接收输入的字符
	cout<<"先序输入字符"<<endl; 
	cin>>ch;
	if(ch == '0')  T = NULL;
	else
	{
		if(! (T = (BiTNode*) malloc (sizeof(BiTNode))))	  return false;
		T->data = ch;
		CreateBiTree(T->lchild) ; //构造左子树
		CreateBiTree(T->rchild) ;//构造右子树 
	}
	return true;
}


/**********************这里构造一个栈 , 遍历二叉树需要栈的支持 ********************************************/
typedef  struct 
{
	BiTree *base;
	BiTree *top;  //指向二叉树节点指针的指针
	int stacksize; //当前以分配的存储空间 , 以元素为单位 
}SqStack;

bool InitStack(SqStack s)
{
	s.base =  (BiTree *)  malloc( STACK_INIT_SIZE * sizeof(BiTree));
	if(!s.base) return false; //存储分配失败
	s.top = s.base;
	s.stacksize = STACK_INIT_SIZE;
//	cout<<"以构造完栈"<<endl;
	return true; 
}

bool  Push(SqStack &s , BiTree e)
{
	//插入指向二叉树节点的指针为栈顶元素
	if(s.top - s.base >= s.stacksize) {  //栈满,追加存储空间 
		s.base = (BiTree *) realloc(s.base , (s.stacksize +STACKINCREMENT) * sizeof(BiTree));
		if(!s.base)  return false;
		s.top = s.base + s.stacksize;
		s.stacksize += STACKINCREMENT;
	} 
	*s.top ++ = e;
//	cout<<"以入栈"<<e->data<<endl;
	return true;
}

bool  Pop(SqStack &s , BiTree &e)
{
	if(s.top == s.base )  return false;  //栈空
	e = * --s.top;
//	cout<<"以退栈"<<e->data<<endl;
	return true; 
}


bool StackEmpty(SqStack s)
{
	if(s.base == s.top) return true;
	else
	{
		return false;
	}
}



bool visit(BiTree e)  //将二叉树的节点显示到控制台上 
{
	//if(e)  return false;
	cout<<e->data;
	return true;
}


SqStack s;  //定义栈头结点 

/*******************以上栈的构造完毕 ****************************/

 
//中序遍历 
bool InOrderTraverse(BiTree T , bool  (*visit)(BiTree e)) //后一个参数为接收visit函数指针 
{
	cout<<"中序遍历二叉树结果如下:"<<endl; 
	InitStack(s); 
	BiTree p ; p=T;
	while(p || !StackEmpty(s))
	{
		if(p)
		{
			Push(s , p) ; p = p->lchild;  //根指针进栈 , 遍历左子树 
		}
		else
		{
			//根指针退栈, 访问根节点 ,遍历右子树
			Pop(s , p); 
			cout<<p->data;
			p = p->rchild;
		}
	}
	return true;
}


//先序遍历
bool PreOrderTracerse(BiTree T , bool (*visit)(BiTree e)) 
{
	if(T)
	{
		if( (*visit)(T))
			if(PreOrderTracerse(T->lchild , visit))
				if(PreOrderTracerse(T->rchild , visit))  return true;
		return false;
	}
	else return true;
}


//后序遍历
bool PosOrderTracerse(BiTree T , bool (*visit)(BiTree e)) 
{
	if(T)
	{
		if(PosOrderTracerse(T->lchild , visit))
			if(PosOrderTracerse(T->rchild ,visit))
				if((*visit)(T))  return true;
		return false;
	}
	else return true;
}


int  main()
{
	//定义一个visit函数指针
	bool (*visit_point) (BiTree e);
	visit_point = visit;
	BiTree T;
	CreateBiTree(T) ;
	cout<<"二叉树构造完成!"<<endl<<endl<<endl; 
	InOrderTraverse(T , visit_point); 
	cout<<endl;
	cout<<"先序遍历结果如下:"<<endl;
	PreOrderTracerse(T , visit_point) ;
	cout<<endl;
	cout<<"后序遍历结果如下:"<<endl;
	PosOrderTracerse(T , visit_point);
	return true;
}

运行结果如图:

具体参见严蔚敏数据结构  第6章 6.3 节

建立与遍历二叉树(C语言) 题目详情 以字符串的形式定义一棵二叉树的先序序列,若字符是‘#’, 表示该二叉树是空树,否则该字符是相应结点的数据元素。读入相应先序序列,建立二叉链式存储结构的二叉树,然后中序遍历该二叉树并输出结点数据。 输入样例: 在这里给出一组输入。例如: ABC##DE#G##F### 输出样例: 在这里给出相应的输出。例如: CBEGDFA 题目要求 先序输入,二叉链式存储,中序输出。 注意函数CreateBiTree(&Tr)和InOrder(Tr)的区别:后者不对树本身进行操作 #i 阅读详情

相关推荐

C++实现二叉树的创建

在 C++ 中,我们可以通过指针和递归的方式来实现二叉树的创建和操作。通过定义节点的数据结构、构造二叉树的节点和实现二叉树的遍历,我们可以更好地理解并掌握这一数据结构。在这个结构体中,val 表示节点的数据,left 和 right 分别表示左子树和右子树的指针。二叉树是一种非常重要的数据结构,它可以用来存储有层次关系的数据,也可以用来进行检索、排序等操作。创建二叉树的节点时,我们通常会先构造根节点,然后再递归构造左右子节点。中序遍历:先访问根节点的左子树元素,然后访问根节点,最后访问右子树元素。

PixelProX的博客 1332

C++二叉树

二叉树建立及最常见的三种遍历

qq_41884952的博客 1444

二叉树三种遍历(动态图+代码深入理解)

文章目录一、图示理解(图片是一位前辈所留,在此感谢)1、先序遍历2、中序遍历3、后序遍历4、层序遍历二、深入理解三种遍历让我们来理解一下绕着外围跑一整圈的真正含义是:遍历所有结点时,都先往左孩子走,再往右孩子走。下面做一个实例吧三、代码实现加以理解以下是C语言全部代码实现下面是同样的例子用c++实现,大家可以参考一下 一、图示理解(图片是一位前辈所留,在此感谢) 1、先序遍历 先序遍历可以想象成,...

流楚丶格念的博客 3万+

使用C++创建二叉树和其基本操作

使用c++创建二叉树,并完成三种遍历以及总节点数、二叉树的深度以及二叉树是否为空。

qq_58240448的博客 1万+

RingBuffer 环形缓冲区----镜像指示位

称作环形缓冲区,也称作环形队列(circular queue),是一种用于表示一个固定尺寸、头尾相连的缓冲区的数据结构,适合缓存数据流。这个宏定义用于计算向下对齐的地址。size和align。size是要对齐的内存大小,align是所需的对齐大小。这个宏返回一个值,该值是size向下对齐到align边界后的地址。例如,假设我们有一个 32 位的系统,并且我们需要将数据对齐到 64 位的边界。我们可以使用在这个例子中,data数组的大小为 10 个元素,我们需要将其对齐到 8 字节边界。宏返回data。

呵呵哒!的博客 2405

nvidia-container-toolkit 国内镜像源安装

nvidia-container-toolkit 国内镜像源安装

湫然的博客 1万+

C语言二叉树创建(一定看的懂)

  先贴一个百度出来的二叉树的图 二叉树 就是首先得有一个根节点.这个节点的入度为0也就是它只有子节点没有父节点 如1号节点     每个节点又有一个左儿子和一个右儿子 当然也可以没有 接下来就是创建.创建一棵树得现有这棵树的结点和树根     首先来声明一个树的结点   typedef struct node{ //树的结点 int data; struct no...

TheSevenSky 8万+

避开地图定位的坑:手把手教你处理GCJ-02和WGS-84坐标转换(2023最新版)

本文深入解析了GCJ-02与WGS-84坐标系转换的核心原理与常见误区,提供了详细的代码实现与精度控制方法。针对地图定位开发中的实际痛点,文章重点阐述了如何通过迭代逼近法实现高精度坐标转换,并给出了误差测试与业务场景下的工程实践指南,帮助开发者有效规避定位漂移等问题。

lstm7chronicler的博客 1166

三种方法建立二叉树(C/C++)

先序建立二叉树

m0_53610575的博客 3713

Python爬虫实战:手把手教你用Selenium绕过药监局网站的反爬机制(附完整代码)

本文详细介绍了如何使用Selenium绕过药监局网站的反爬机制,提供了一套完整的Python爬虫实战方案。通过浏览器指纹伪装、动态等待策略、会话维持技巧以及分布式采集设计,帮助开发者高效爬取药监局数据,解决政府类网站常见的反爬挑战。

weixin_42620255的博客 737

LABVIEW学习之MODBUS-TCP通讯

LABVIEW学习之MODBUS-TCP通讯 1,MODBUS-TCP通讯介绍: MODBUS通讯是工业上面经常用到的一种通讯协议。该协议的原理及介绍不在此累述,下面直接介绍LABVIEW对此协议的应用。 2,MODBUS通讯所需的函数: 安装了DSC模块之后可以在数据通信内找到相关函数 3 ,主VI 主要思路就是使用状态机来进行连接 读取 写入 断开。使用枚举类型来选择状态: 1,连接 2,写入多个M继电器: 3,写入单个M继电器 4,写入双字节D...

风动9527的博客 2万+

python构建二叉树_Python 二叉树的层序建立与三种遍历实现详解

分享二叉树的建立例题,以及三种遍历首先不要从网上复制,再就是最好是自己编的,最重要的是二叉树的建立,/* bu用递归法输出中序和后续*/ #include "stdio.h" #include "stdlib.h" #define A 25 typedef struct Btree { char data; struct Btree *lchild,*rchild; }*tree,t2ree; t...

weixin_39882870的博客 418

基于双目视觉的行车中障碍距离检测方法研究与目标跟踪

本文将介绍基于Python语言的双目视觉技术,以及如何使用该技术检测行车中的障碍物并跟踪目标。双目视觉利用两个摄像头模拟人眼的立体视觉,通过对两个摄像头所捕捉的图像进行比较和分析,可以得到物体的深度信息。首先,我们需要安装Python的OpenCV库,该库提供了丰富的图像处理和计算机视觉功能。接下来,我们进入一个循环中,不断读取左右图像,并将其转换为灰度图像。在视差图上,您可以实现目标检测和跟踪算法来识别和跟踪行车中的障碍物。请注意,上述代码只是一个简单示例,您可以根据具体需求和算法进行修改和扩展。

ZgnObjectivec的博客 276

C语言实现二叉树遍历的递归和非递归算法

本文主要介绍二叉树的各种遍历方法。 二叉树的遍历 所谓二叉树的遍历,是指按某条搜索路径访问树中的每个结点,使得每个结点均被访问一次,而且仅被访问一次。 由二叉树的递归定义可知,遍历一棵二叉树便要决定对根结点NNN、**左子树LLL和右子树RRR**的访问顺序。按照先遍历左子树再遍历右子树的原则,常见的遍历次序有: 前序遍历:(N L R) 中序遍历:(L N R) 后序遍历:(L R L) 这...

From Zero to Hero 2万+

分布式计算Ray框架面试题及参考答案

动态任务图执行引擎是一种能够根据任务之间的依赖关系和运行时的实际情况,动态构建和执行任务图的系统。在 Ray 中,动态任务图执行引擎允许任务在运行时根据数据可用性、计算资源状态等因素,灵活地决定后续任务的执行顺序和方式。对于 AI 应用来说,其往往具有动态性的特点。例如,在深度学习模型的训练过程中,可能需要根据训练的结果动态调整下一轮训练的参数、数据增强方式或者模型结构。动态任务图执行引擎可以很好地支持这些动态需求。它能够根据 AI 应用中各个任务的实时输出和依赖关系,动态地生成和调整任务图。

大模型大数据攻城狮的专栏 1349

[Dify] 多步对话流程的实现技巧:构建连贯自然的多轮交互系统

摘要:本文探讨了AI系统中实现多轮对话的核心技术与应用方法。文章首先分析了多步对话的典型场景(如机票预订、财务报告生成)及其价值,提出了Dify平台实现该功能的三大机制:变量系统、条件控制和状态管理。随后详细介绍了顺序型、条件型和确认型三种基本对话模式,并通过"会议预约助手"案例展示了实际应用流程。文章还提供了提示词设计、变量引用等实用建议,并强调多轮对话成功的关键在于清晰的结构设计而非单纯依赖模型能力,最终实现自然流畅的人机交互体验。

技术小甜甜:传播可落地技术,帮助个人和企业降低解决真实场景问题的成本 1342

【数据结构】【C/C++】二叉树的三种遍历 递归方法代码实现

首先你要学会创建一棵二叉树,可以参考我的这篇文章【数据结构】【C/C++】创建二叉树-链式存储-C和C++双语教学 其次,你要知道什么叫做先序中序和后序遍历,可以参考这篇文章【数据结构】理解二叉树的三种遍历–前序、中序、后序 +层序(简明易懂) 知道了这些后,我们来一起看看二叉树先序中序和后序遍历的实现代码! 非递归方法请关注下一篇 解析与代码 还记得我们上一篇中说的么?【数据结构】理解二叉树的三...

YuXi_0520的博客 2717

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

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

二叉树的三种遍历方式(先序、中序、后序)代码实现

二叉树的三种遍历方式 1.定义结点数据结构 2.插入根结点 3.插入新结点 4.访问结点的操作 5.先序遍历 6.中序遍历 7.后序遍历 8.土方法构造一个树 9.测试 10.输出结果 所用编译器:Visual Studio Code 1.43.0 C++环境 #include <stdio.h> #include <stdlib.h> typedef int ElemTy...

a1369760658的博客 4416

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

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

TMS_WebGMaps_1.9.8.0_Full_Source

TMS_WebGMaps_1.9.8.0_Full_Source 全源码 delphi cbuilder

C++实现的二叉树创建和遍历,超入门邻家小女也懂了

所有层的节点都达到最大数量,叶子除外的所有节点都有两个子节点,所有叶子都在最底一层(k)且数目为2^(k - 1)。如果删除最底一层的所有叶子它就是满二叉树,即除了最后一层,每层节点都达到最大数量 ,即有深度k的个节点数在左闭右开【2^(k-1)+1,2^k-1】区间内。1. 具有N个节点的完全二叉树的深度为[log2 N]+1,其中[x]为高斯函数,截尾取整。(3)若在任意一棵二叉树中,有n0个叶子节点,有n2个度为2的节点,则必有n0=n2+1。(1)如果i=1,则节点i是二叉树的根,无双亲......

汉阳Hann's Home 1万+

lwip-2.0.3

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

二叉树的建立 先序 中序 后序遍历 树的深度 叶子结点个数(C/C++语言实现)

#对建立的二叉树进行先序遍历,中序遍历,后序遍历,求树的深度,叶子结点个数。 我们用C语言实现 #include <stdio.h> #include <stdlib.h> struct btnode { char data;//数据域 struct btnode *lchild,*rchild;//左孩子,右孩子 }; typedef struct btnode bitreptr;//重新命名 int n=0; bitreptr* creatbt()//创建二

加油高同志 4405

C语言二叉树建立与遍历—实验报告

系别计算机学院班级学号姓名课程名称数据结构实验日期实验名称二叉树的建立与遍历算法应用成绩实验目的:熟悉掌握二叉链表存储结构及基本算法,并能应用二叉树的基本算法解决与之有关的简单问题,训练和提高结构化程序设计能力及程序调试能力。实验条件:计算机一台,Visual C++6.0或DEV C++判断一棵二叉树是否为满二叉树。要求二叉树用二叉链表存储,用先序、中序、后序递归遍历算法的任意两种输出二叉树中所有结点,编写程序判断该树是否为满二叉树。int val;// 结点的值。

冰小九的博客 2411

通过先序遍历和中序遍历建立二叉树

在对二叉树进行操作之前,建树是必须要做的。假设现在有某二叉树的先序遍历和中序遍历,我们应该如何建树? 基本思路: 分别求得根节点的左子树和右子树的先序遍历序列与中序遍历序列 分别以左子树和右子树为新树进行第一步操作 直至没有子树为止 那么我们这么实现呢? 根据我们对二叉树遍历的学习,可以知道: 先序遍历序列中的第一个节点为根节点 一个节点的左右子节点分别位于中序遍历序列中该节点的两侧 举个例子: 对于图中二叉树,其先序遍历序列与中序遍历序列如右侧所示,每个序列共6个字母(此二叉树共有6个节点)。

MingYI 7374

详解二叉树的遍历

概述 二叉树的遍历是一个很常见的问题。二叉树的遍历方式主要有:先序遍历、中序遍历、后序遍历、层次遍历。先序、中序、后序其实指的是父节点被访问的次序。若在遍历过程中,父节点先于它的子节点被访问,就是先序遍历;父节点被访问的次序位于左右孩子节点之间,就是中序遍历;访问完左右孩子节点之后再访问父节点,就是后序遍历。不论是先序遍历、中序遍历还是后序遍历,左右孩子节点的相对访问次序是不变的,总是先访问左孩子...

supermouse的博客 1万+

《数据结构》实验报告(四)——二叉树的遍历及相关应用

注:代码直接从实验报告上复制的,可能格式啥的有错误。 一、实验目的 (1) 掌握用 C 语言调试程序的基本方法。 (2) 掌握二叉树的基本定义及其存储实现。 (3) 掌握二叉树的基本操作,如二叉树的建立、遍历、结点个数统计、树的深度计算等。 二、实验环境 Windows 10,Microsoft Visual C++ 2010 Express 三、实验内容 1、内容描述 用递归的方法实现以下二叉树算法: (1) 以二叉链表表示二叉树,建立一棵二叉树(先序); (2) 输出二叉树的中序遍历结果; (3) 输出

weixin_44197749的博客 1万+

二叉树的建立删除及三种遍历实现

二叉树的建立、删除及三种遍历的C++实现 教材上的Tree类写法太累赘,不实用,将树节点直接写成结构体即可 要理解结点的含义以及根结点的重要意义 #include #include //用CPP文件编写,否则编译出错,需要加struct且delete不识别 struct TreeNode { int val; TreeNode * left, * right; }; TreeNode

Coding for Dreams 2523

C++ 实现二叉树的三种遍历方式(前序,中序,后序)

二叉树遍历 核心就看父节点的位置,在前中后,就是什么遍历; 树结构核心是一种非线性的递归思想; 前序遍历 中序遍历 后续遍历 关于二叉树的遍历方式,经常有人会提到,如何遍历,以及怎么实现; 现在用C++实际操作一下,用于验证; 其次,既然有三种顺序,那么当然与查找的结果不一样了。顺便说明了一下; 运行环境:VScode 编程语言:C++ 代码实现 #include <iostream> typedef struct BinaryNode { char ch; str

a1534219218的博客 1115
上一篇: 表达式求值
下一篇: Oracle数据库的下载安装教程
libingbojava
博客等级 码龄9年 64粉丝 111原创
评论 5
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值