数据结构(C实现)------- 遍历二叉树

C语言实现二叉树的遍历(数据结构) 二叉树的定义 二叉树(binary tree)是指树中节点的度不大于2的有序树,它是一种最简单且最重要的树。二叉树的递归定义为:二叉树是一棵空树,或者是一棵由一个根节点和两棵互不相交的,分别称作根的左子树和右子树组成的非空树;左子树和右子树又同样都是二叉树 二叉树的性质 二叉树遍历 二叉树有三种遍历方式,分别为先序遍历、中序遍历、后序遍历 先序遍历: (1)先访问根节点。 (2)再访问左子树。 (3)最后访问右子树。 中序遍历: (1)先访问左子树。 . 阅读详情

        本文是自己学习所做笔记,欢迎转载,但请注明出处:http://blog.youkuaiyun.com/jesson20121020

        二叉树是另一中树型结构,它的特点是每个结点至多只有两棵子树(即二叉树中不存在度大于2的结点),并且,二叉树的子树有左右之分,其次序不能任意颠倒。

        根据二叉树的的递归定义可知,二叉树是由3个基本单元组成,根结点、左子树和右子树,因此,若能依次遍历这三部分,便是遍历了整个二叉树。假如以L、D、R分别表示遍历左子树、访问根结点和遍历右子树,则可能有DLR、LDR、LRD、DRL、RDL、RLD这6种遍历二叉树的方案。若限定先左后右,则只有前3种情况,分别称为先序遍历、中序遍历和后序遍历,另外,还有一种遍历方法,即从上到下,从左到右依次遍历二叉树的每个结点,称之为层次遍历。 故,共有4种遍历二叉树的方法。

二叉树遍历操作定义:

      1. 先序遍历二叉树的操作定义:

             若二叉树为空,则空操作;否则

                 1) 访问根结点

                 2) 先序遍历左子树

                 3) 先序遍历右子树

      2. 中序遍历二叉树的操作定义:

              若二叉树为空,则空操作;否则

                 1) 中序遍历左子树

                 2) 访问根结点

                 3) 中序遍历右子树

        
     3. 后序遍历二叉树的操作定义:

              若二叉树为空,则空操作;否则

                 1) 后序遍历左子树

                 2) 后序遍历右子树

                 3) 访问根结点

   

     4. 层次遍历二叉树的操作定义:

              若二叉树为空,则空操作;否则

                 1) 从上到下

                 2) 同一层,从左到右依次遍历

二叉树的存储结构:

       1. 顺序存储结构:         

#define MAX_TREE_SIZE 100
typedef char TElemType; 
typedef TElemType SqBiTree[MAX_TREE_SIZE];
SqBiTree bt;

      2. 链式存储结构:

//二叉树的的
#define MAXSIZE 100 //二叉树中最多的结点数 
typedef char TElemType; 
typedef struct BiTNode{
	TElemType data;
	struct BiTNode *lchild,*rchild;
}BiTNode,*BiTree;

二叉树的遍历具体实现:

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

//二叉树的的
#define MAXSIZE 100 //二叉树中最多的结点数 
typedef char TElemType; 
typedef struct BiTNode{
	TElemType data;
	struct BiTNode *lchild,*rchild;
}BiTNode,*BiTree;

//定义函数指针
typedef void(* Visit)(BiTree);

//二叉树的初始化
void Init_BiTree(BiTree *T){
	*T = NULL;
}

//判断二叉树是否为空,返回1
int IsEmpty_BiTree(BiTree *T){
	return *T == NULL;
}

//创建二叉树
void Create_BiTree(BiTree *T){
	char ch;
	ch = getchar();
	//当输入的是"#"时,认为该子树为空
	if(ch == '#')
		*T = NULL;
	//创建树结点
	else{
		*T = (BiTree)malloc(sizeof(BiTNode));
		(*T)->data = ch; //生成树结点
		//生成左子树
		Create_BiTree(&(*T)->lchild);
		//生成右子树
		Create_BiTree(&(*T)->rchild);
	}
}

//输出结点的值
void Print_BiTreeNode(BiTree T){
	printf("%c\t",T->data);
	
}

//先序遍历二叉树
void PreOrder_BiTree(BiTree T,Visit visit){
	if(!IsEmpty_BiTree(&T)){
		visit(T);
		PreOrder_BiTree(T->lchild,visit);
		PreOrder_BiTree(T->rchild,visit);
	}
}
//中序遍历二叉树
void InOrder_BiTree(BiTree T,Visit visit){
	if(!IsEmpty_BiTree(&T)){
		InOrder_BiTree(T->lchild,visit);
		visit(T);
		InOrder_BiTree(T->rchild,visit);
	}
}

//后序遍历二叉树 
void PostOrder_BiTree(BiTree T,Visit visit){
	if(!IsEmpty_BiTree(&T)){
		PostOrder_BiTree(T->lchild,visit);
		PostOrder_BiTree(T->rchild,visit);
		visit(T);
	}
}

//层次遍历二叉树 
void LevelOrder_BiTree(BiTree T,Visit visit){
	//用一个队列保存结点信息,这里的队列采用的是顺序队列中的数组实现
	int front = 0;
	int rear = 0;
	BiTree BiQueue[MAXSIZE];
	BiTree tempNode;
	if(!IsEmpty_BiTree(&T)){
		//将根结点加入到队列中 
		BiQueue[rear++] = T;
		
		while(front != rear){
			//取出队头元素,并使队头指针向后移动一位 
			tempNode = BiQueue[front++];
			//判断左右子树是否为空,若为空,则加入队列 
			if(!IsEmpty_BiTree(&(tempNode->lchild)))
				BiQueue[rear++] = tempNode->lchild;
			
			if(!IsEmpty_BiTree(&(tempNode->rchild)))
				BiQueue[rear++] = tempNode->rchild;
			
			//输出队头结点元素 
			//Vist_BiTreeNode(tempNode->data);
			visit(tempNode);
		}
	}
}

int main(){
	BiTree T;
	//将二叉树初始为一个空的二叉树
	Init_BiTree(&T);
	//创建二叉树
	Create_BiTree(&T);
	//先序遍历
	printf("\n先序遍历结果:");
	PreOrder_BiTree(T,Print_BiTreeNode);
	//中序遍历二叉树
	printf("\n中序遍历结果:");
	InOrder_BiTree(T,Print_BiTreeNode);
	//后序遍历二叉树 
	printf("\n后序遍历结果:");
	PostOrder_BiTree(T,Print_BiTreeNode);
	//层次遍历二叉树 
	printf("\n层次遍历结果:");
	LevelOrder_BiTree(T,Print_BiTreeNode);
	return 0;
}

二叉树的遍历结果:

         给定二叉树,如,输入1247###5#8##36###




 

 

            




RTT(RT-Thread)串口设备(RTT保姆级教程) 本章主要介绍串口设备在RT-Thread操作系统中应用层如何使用。关于串口设备的使用,我们只需要在应用层找到串口设备,然后去初始化,初始化完成以后就可以读写串口设备了。操作的方法在应用层,驱动是不需要我们去完成的,驱动已经在操作系统中提供了。 阅读详情

相关推荐

告别CANoe?手把手教你用Python+PCAN搭建汽车诊断脚本(附完整代码)

本文详细介绍了如何利用Python和PCAN硬件搭建高性价比的汽车诊断自动化方案,替代昂贵的CANoe工具。通过开源库python-can和udsoncan实现UDS诊断协议,涵盖硬件选择、环境配置、核心功能实现及性能优化,附完整代码示例,助力开发者快速构建诊断脚本。

weixin_42551227的博客 373

数据结构-C语言实现一个二叉树

命名恐慌症,stack和二叉树的结点名字,函数名字有点相似,希望以后能注意这个问题 收获 typedef struct node{ BiTree lchild; BiTree rchild; T data; }Node; Node为一个类型(相当于int char),这样写是为了方便,以后写类型的时候不用写struct node struct node{ Bi...

小撇儿1992的博客 1408

国产PLC实战:用汇川Easy320搞定TCP通信,手把手教你网口转串口控制设备

本文详细解析了如何使用汇川Easy320 PLC实现TCP通信与串口控制,解决工业自动化中设备间通信协议差异问题。通过实战案例和代码示例,展示了Easy320在协议转换、数据解析和串口转发中的高效应用,帮助工程师快速掌握网口转串口控制技术。

weixin_31774841的博客 500

15 二叉树的中序遍历(Binary Tree Inorder Traversal)

文章目录1 题目2 描述3 解决方案3.1 递归算法3.1.1 遍历法(Traverse)思路源码3.1.2 分治法(Devide And Conquer)思路源码3.2 非递归算法3.2.1 二叉树遍历的非递归通用解法思路源码图解3.3 时间复杂度3.4 空间复杂度 1 题目   二叉树的中序遍历(Binary Tree Preorder Traversal) lintcode:题号——67,难度——easy 2 描述   给出一棵二叉树,返回其节点值的中序遍历。 名词: 遍历 按照一定的顺序对树

SeeDoubleU的专栏 2213

【电子电力】IEEE33节点系统参数及拓扑图visio

IEEE33节点系统是一种广泛用于电力系统分析和研究的标准配电网络。该系统具有典型的辐射结构,适用于负载流分析、分布式发电优化及电力系统的可靠性评估。本报告主要基于IEEE33节点系统的拓扑图,讨论其在电子电力系统中的应用。通过MATLAB仿真分析了节点的电压分布、功率损耗等关键参数,并验证了系统的稳定性和有效性。

2401_84610415的博客 1万+

Frida三层次钩子快速逆向VMP+OLLVM加固APK

VMP(虚拟机保护)和OLLVM(控制流平坦化)是Android应用常见的双重混淆技术,其核心原理是将Java逻辑虚拟化、Native代码控制流打散,从而阻断传统静态分析与简单Hook。但任何混淆都必须在CPU上执行,因此必然暴露JNI注册行为、ABI参数传递规律及系统调用痕迹。基于此,Frida可通过跨层联动——从JNI_OnLoad捕获Native库加载、在VMP解释器入口截获字节码上下文、于关键系统调用(如read/gettimeofday)反向追踪数据流——构建可观测、可复现的动态分析链。该方法无需

weixin_30888413的博客 1002

【数据结构】二叉树的定义及二叉树的遍历,肯定是最详细的(附有源码-可直接运行)

【数据结构】二叉树的定义及二叉树的遍历,肯定是最详细的(附有源码-可直接运行)前边的可以的

m0_61196970的博客 1417

从零开始搭建GD32F103CBT6开发环境:VSCode配置与实战技巧

本文详细介绍了如何从零开始为国产MCU GD32F103CBT6搭建高效的VSCode开发环境。内容涵盖工具链安装、VSCode核心插件配置、工程目录结构规划、关键配置文件编写以及Makefile实战,旨在帮助开发者摆脱传统IDE束缚,利用现代化工具链提升嵌入式开发效率。

weixin_29158413的博客 448

【数据结构】---树:中序遍历

中序遍历,是数据结构中树的遍历方式之一。特点:左、根、右。每次遍历时,先遍历左节点的数据,之后遍历本节点,最后遍历右节点,循环往复,直至树中数据遍历完成。二叉查找树进行中序遍历后,返回的序列是排好序的。数据结构方面的内容刚刚接触,讲解不够深刻,还望谅解。

qq_54185425的博客 1万+

【C语言学习疑难杂症】第20期:0x00007FF7F2821964处引发的异常0xC0000005写入位置 0x0000000000000

检查代码中是否存在野指针访问的情况,确保在进行写入操作之前,内存已经被正确分配或初始化,并且在使用完毕后进行了正确的释放。空指针访问:代码尝试在空指针地址(0x0000000000000000)处进行写入操作,导致访问冲突。检查代码中是否存在数组越界的情况,确保在进行写入操作之前,数组的索引值在合法范围内。检查代码中是否存在空指针访问的情况,确保在进行写入操作之前,指针已经被正确初始化。野指针访问:代码尝试在已释放或未初始化的内存地址进行写入操作,导致访问冲突。

学无止境 828

MATLAB - 激光雷达 - 相机联合标定(Lidar-Camera Calibration)

激光雷达传感器和相机通常在自动驾驶应用中结合使用,因为激光雷达传感器收集三维空间信息,而相机则以二维图像捕捉空间的外观和纹理。您可以融合来自这些传感器的数据来改进物体检测和分类。激光雷达-相机标定可以估算出一个变换矩阵,给出两个传感器之间的相对旋转和平移。在进行激光雷达-相机数据融合时,您可以使用该矩阵。本图说明了激光雷达和相机标定 (LCC) 过程的工作流程,我们使用棋盘格作为标定对象。我们从激光雷达和相机数据中提取棋盘角和平面,然后在它们的坐标系之间建立几何关系,进行标定。

机器人控制与仿真应用 7371

二叉树的基本概念及遍历(先中后)序

树形结构: 在思考二叉树之前我们需要先对“树”这种结构有一定的认识: 树是一种非线性的数据结构,它是由n(n>=0)个有限结点组成一个具有层次关系的集合。把它叫做树是因为它看 起来像一棵倒挂的树,也就是说它是根朝上,而叶朝下的。它具有以下的特点: 有一个特殊的节点,称为根节点,根节点没有前驱节点 除根节点外,其余节点被分成M(M > 0)个互不相交的集合T1、T2、…、Tm,其中每一个集合 Ti (1 <= i <= m) 又是一棵与树类似的子树。每棵子树的根节点有且只有一个前驱,可

weixin_43771381的博客 629

【笔记篇】Davinci Configurator EcuM模块

autosar ecum模块简介

weixin_47571898的博客 1268

【数据结构-树】C语言实现遍历二叉树

遍历二叉树先中后序递归遍历二叉树中序非递归遍历二叉树 先中后序递归遍历二叉树 #include <stdio.h> #include <stdlib.h> #define OK 1 #define ERROR 0 #define TRUE 1 #define FALSE 0 typedef int Status; typedef struct BiTNode { char data; struct BiTNode *lchild,*rchild; }BiTNode,*Bi

weixin_43716338的博客 570

TMS_WebGMaps_1.9.8.0_Full_Source

TMS_WebGMaps_1.9.8.0_Full_Source 全源码 delphi cbuilder

大中型超市收银系统(可直接运行)

光步前台收银系统系统功能:商品销售、商品退货、挂单、收银员权限、会员销售、单品取消、整单取消、商品查询、脱机销售、脱机数据上传,基本资料下载,开钱箱、小票打印、收款结算,支持多币种付款方式(现金、储值卡、礼券、微信等),支持多种促销。运行环境:.net 4.0登陆信息用户名:1001 密码:123456内置商品信息,商品编码可输入00001000 - 00010000,测试效果相关功能键F5 结算 F9挂单 F11商品查询 F8退货 Insert单品取消 Del整单取消 F12开钱箱F2 会员 Ctrl+Z退出系统 Home 锁屏 相关源码待公开

《数据结构》C语言——二叉树的链式存储实现以及先序、中序、后序遍历的实现

#include<stdio.h> #include<stdlib.h> typedef struct BinaryTreeNode{ char data; struct BinaryTreeNode *lchild,*rchild; }BinaryTreeNode,*BinTree; void PreCreateBT(BinTree *t){ char ch; ch = getchar(); if(ch == '#') *t = NULL; else{

Lavener_Love的博客 1622

NTscan扫描工具

ntscan是一个扫描器,可以扫描没有密码和弱密码的共享,先到配置文件中填写猜测的用户名和密码,扫描过程中右侧出现的是扫描日志。

【数据结构】C语言实现二叉树的基本操作——二叉树的遍历(先序遍历、中序遍历、后序遍历)

【数据结构】第五章——树与二叉树 详细介绍二叉树的三种遍历及其C语言实现……

蒙奇D索大的博客 3871

汉书HE8,好用的汇编代码编写工具

汉书HE8,好用的汇编代码编写工具早期编写汇编代码所用功能强大

C语言数据结构之递归实现二叉树的建立及遍历

C语言数据结构之递归实现二叉树的建立及遍历

C_Engineer的博客 2356

【数据结构】--- 二叉树的递归遍历和非递归遍历【C语言实现】

目录 1. 创建一颗二叉树 2.递归前序遍历二叉树 3.递归中序遍历二叉树 4.递归后序遍历二叉树 5. 测试递归打印二叉树代码 6. 非-递归前序遍历二叉树 7.非-递归实现中序遍历二叉树 8.非 - 递归实现后序遍历【较为复杂的方法】 9.非 - 递归实现后序遍历【简单的方法】 10. 二叉树的层次遍历 11. 最后:附全部代码: 对于二叉树的非递归 深度优先遍历,使用的都是栈 对于二叉树的层次遍历,使用的是队列 1. 创建一颗二叉树 依据前序遍...

mike_jun的博客 3万+

C语言 数据结构 二叉树实现、二叉树的三种递归遍历

二叉树 在计算机科学中,二叉树(英语:Binary tree)是每个节点最多只有两个分支(即不存在分支度大于2的节点)的树结构。通常分支被称作“左子树”或“右子树”。二叉树的分支具有左右次序,不能随意颠倒。 以下代码的二叉树图形表示 代码 #define _CRT_SECURE_NO_WARNINGS #include&amp;amp;lt;stdio.h&amp;amp;gt; #include&amp;amp;lt;stdlib.h&amp;amp;gt...

寒泉 2763

数据结构C语言实现-二叉树遍历

一、二叉树简介: 1、概论: 二叉树(binary tree)是指树中节点的度不大于2的有序树,它是一种最简单且最重要的树。二叉树的递归定义为:二叉树是一棵空树,或者是一棵由一个根节点和两棵互不相交的,分别称作根的左子树和右子树组成的非空树;左子树和右子树又同样都是二叉树。 2、二叉树的优势: 二叉树在实际使用时会根据链表和有序数组等数据结构的不同优势进行选择。有序数组的优势在于二分查找,链表的优势在于数据项的插入和数据项的删除。但是在有序数组中插入数据较慢,在链表中查找数据项效率较低。综合以上情况,二叉树

DavidGarrett的博客 1076

数据结构堆的创建,二叉树的创建,遍历以及部分功能的实现(C语言实现)

数据结构堆的创建,二叉树的创建,遍历以及部分功能的实现

weixin_44902463的博客 220

【数据结构】A.输入根据用户的输入信息,建立二叉树的二叉链表。 B.利用递归和非递归实现二叉树的先序、中序、后序遍历,利用队列实现二叉树的层次遍历。 C.求所有叶子结点总数及深度。

程序代码 #include<stdio.h> #include<stdlib.h> #include<string.h> #define MaxSize 100 //二叉树 typedef struct BTN { char data; struct BTN *lchild,*rchild; }BTN,*BiTNode; //二叉树非递归遍历栈 ty...

Up_Long的博客 2417

【数据结构】C语言递归实现二叉树遍历

一.头文件 BTree.h #include <stdio.h> typedef char BTDataType; #define ENDTAG '#' typedef struct BinaryTreeNode { BTDataType _data; struct BinaryTreeNode* _left; struct BinaryTreeNode* _right; }BT...

weixin_43550839的博客 687

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

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

YuXi_0520的博客 2718

aes算法c语言实现_C语言实现常用数据结构:二叉树以及七种遍历算法(第11篇)...

「今天是学习C语言第 154 天」纸上学来终觉浅,绝知此事要躬行。——陆游「冬夜读书示子聿」# 二叉树二叉树是最常用的树型数据结构,用来表示分支关系和层次关系。二叉树是由根元素、左子树和右子树组成。满二叉树:特殊的二叉树,树中所有分支结点都有左右子树,叶子结点都在最后一层。完全二叉树:不要求所有分支结点都有左右子树,但是要求所有已存在的结点位置与满二叉树对应,叶子结点只能出现最后一层和...

weixin_40001275的博客 113

数据结构实验 二叉树的中序非递归遍历 c语言实现

binarytree.c #include"stack.h" #include<stdlib.h> #include<stdio.h> void CreateBiTree(BiTree **bitree,int i)//初始的时候输入i=0; { //i++; //if(i==3||i==4||i==8||i==10||i==11||i==13||i==14||i==15) //bitree=NULL; //先序建树 int num;

weixin_52787728的博客 325
上一篇: 设计模式解析
下一篇: java设计模式 -------- 创建模式 之 简单工厂模式
jesson20121020
博客等级 码龄15年 361粉丝 99原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值