二叉树及其遍历算法

数据结构-二叉树介绍及其在Java中遍历算法实现 1、二叉树(Binary tree)的定义二叉树(binary tree)是树形结构的一个重要类型,是指树中节点的度不大于2的有序树,它是一种最简单且最重要的树。二叉树的递归定义为:二叉树是一棵空树,或者是一棵由一个根节点和两棵互不相交的,分别称作根的左子树和右子树组成的非空树;2、二叉树具的性质性质1:二叉树的第i层上至多有2i-1(i≥1)个节点。性质2:深度为h的二叉树中至多含有2h-1个节点。性质3:若在任意一棵二叉树中,有n0个叶子节点,有n2个度为2的节点,则必有n0=n2+1。性质4。 阅读详情

树可分为:普通树、二叉树、森林。普通树与森林均可转化为二叉树来存储。

二叉树:任一节点的子节点个数最多2个,且子节点的顺序不能更改。

二叉树的存储方式分为:(1)连续存储

                                        (2)链式存储:每个节点可以分为三部分:数据域、左指针域、有指针域。

二叉树的遍历算法:(1)先序遍历:先访问根节点,再访问左子树,后访问右子树(根—>左—>右)。

                                (2)中序遍历:先访问左子树,再访问根节点,后访问右子树(左—>根—>右)。

                                                           在每一个二叉树单元中,始终保证(左—>根—>右)的访问顺序。

                                (3)后序遍历:先访问左子树,再访问根节点,后访问根节点(左—>右—>根)。

                                                           在每一个二叉树单元中,始终保证(左—>右—>根)的访问顺序。

已知 中序和先序  或中序和后序  才能唯一确定一个二叉树。


链式二叉树代码实现: 

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

struct BTNode
{
	char data;
	struct BTNode * pLchild;
	struct BTNode * pRchild;
};

struct BTNode * CreateBTree(void);			//创建二叉树,返回根节点地址
void PostTraverseBTree(struct BTNode * pT); //后序遍历二叉树
void PreTraverseBTree(struct BTNode * pT);	//先序遍历二叉树
void InTraverseBTree(struct BTNode * pT);	//中序遍历二叉树

int main(void)
{
	struct BTNode * pT = CreateBTree();
	
	printf("先序遍历二叉树\n");

	PreTraverseBTree(pT);

	printf("中序遍历二叉树\n");
     
	InTraverseBTree(pT);

	printf("后序遍历二叉树\n");

	PostTraverseBTree(pT);
	
	return 0;
}

void PostTraverseBTree(struct BTNode * pT)
{
	if (NULL != pT)  //加if判断语句是防止节点的指针域为NULL时报错
	{
		if (NULL != pT->pLchild)
		{
			PostTraverseBTree(pT->pLchild);    //先访问左子树
		}	
		if (NULL != pT->pRchild)
		{
			PostTraverseBTree(pT->pRchild);	   //再访问根节点
			//pT->pLchild可以代表整个左子树
		}
		printf("%c\n", pT->data);			   //后访问根节点
	}
}

void InTraverseBTree(struct BTNode * pT)
{
	if (NULL != pT)
	{
		if (NULL != pT->pLchild)
		{
			InTraverseBTree(pT->pLchild);     //先访问左子树
		}
		
		printf("%c\n", pT->data);			  //再访问根节点	
	
		if (NULL != pT->pRchild)
		{
			InTraverseBTree(pT->pRchild);     //后访问右子树
			//pT->pLchild可以代表整个左子树
		}	
	}
}

void PreTraverseBTree(struct BTNode * pT)
{
	if (NULL != pT)
	{
		printf("%c\n", pT->data);			 //先访问根节点
	
		if (NULL != pT->pLchild)
		{
			PreTraverseBTree(pT->pLchild);   //再访问左子树
			//pT->pLchild可以代表整个左子树
		}
		
		if (NULL != pT->pRchild)
		{
			PreTraverseBTree(pT->pRchild);  //后访问右子树
			//pT->pLchild可以代表整个右子树
		}	
	}	

}

struct BTNode * CreateBTree(void)
{
	struct BTNode * pA = (struct BTNode *)malloc(sizeof(struct BTNode));
	struct BTNode * pB = (struct BTNode *)malloc(sizeof(struct BTNode));
	struct BTNode * pC = (struct BTNode *)malloc(sizeof(struct BTNode));
	struct BTNode * pD = (struct BTNode *)malloc(sizeof(struct BTNode));
	struct BTNode * pE = (struct BTNode *)malloc(sizeof(struct BTNode));

	pA->data = 'A';
	pB->data = 'B';
	pC->data = 'C';
	pD->data = 'D';
	pE->data = 'E';

	pA->pLchild = pB;
	pA->pRchild = pC;
	pB->pLchild = pB->pRchild = NULL;
	pC->pLchild = pD;
	pC->pRchild = NULL;
	pD->pLchild = NULL;
	pD->pRchild = pE;
	pE->pLchild = pE->pRchild = NULL;

	return pA;          //返回根节点地址
}


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

相关推荐

二叉树的遍历(七种方法)

本章主要通过运用递归与非递归方法分别对二叉树进行遍历 主要分先序遍历、中序遍历、后序遍历以及层次遍历四种情况进行讨论

AIGC 1万+

二叉树遍历算法

栈 注: 1,三种遍历都是先把二叉树的最左结点循环入栈,以帮助找到返回处理的节点。 每个子树也是先把该右子树中的最左节点循环入栈,以帮助找到返回处理的节点。 先序遍历和中序遍历都是通过一个子树的最右下叶节点的right带出接下来的处理结点,表明该子树的左子树已经遍历处理完毕。因为不管先序遍历还是中序遍历,一颗子树的结束点是在该子树的最右下叶节点。 2,先序和中序代...

u011764940的博客 3862

IWR6843ISK+DCA1000EVM 本人遇到的所有报错和解决方案

本文详解了初次使用DCA1000EVM和mmave studio遇到的一系列的问题以及解决方法

2301_77883976的博客 3313

二叉树的四种遍历算法

二叉树在作为一种重要的数据结构,它的很多算法的思想在很多地方都用到了,比如说大名鼎鼎的 STL 算法模板,里面的优先队列(priority_queue)、集合(set、map)等等都用到了二叉树里面的思想,如果有兴趣的小伙伴可以去查找一些这些方面的资料。但是我们现在先不讨论那么高深的数据结构,我们先从二叉树的遍历开始:先来看一下二叉树长什么样子:这是百度来的一张二叉树图,我们可以看到, 这棵二叉树一

指点 3万+

GoPro官方API实战:从蓝牙配对到Wi-Fi流媒体,构建跨平台控制应用

本文详细解析了GoPro官方API的开发实践,涵盖蓝牙配对、Wi-Fi流媒体控制等关键技术。通过实战案例,指导开发者如何构建跨平台控制应用,解决设备发现、指令解析、视频流传输等核心问题,并分享Android平台迁移经验与常见问题排查方法。

weixin_30727835的博客 397

ESP32驱动TFT屏幕实战:LVGL与TFT_eSPI完美结合

本文详细介绍了如何在ESP32上结合TFT_eSPI驱动库与LVGL图形库,实现高效、流畅的嵌入式GUI开发。内容涵盖硬件连接、软件环境搭建、库配置、LVGL移植、界面创建及性能优化等全流程实战指南,帮助开发者快速构建低成本、高性能的交互式显示应用。

weixin_29206669的博客 200

二叉树的遍历算法

遍历是对树的一种最基本的运算,所谓遍历二叉树,就是按一定的规则和顺序走遍二叉树的所有节点,使每一个节点都被访问一次,而且只被访问一次。由于二叉树是非线性结构,因此,树的遍历实质上是将二叉树的各个节点转换成为一个线性序列来表示。 ​​​​​​​ ​​​​​​​ 二叉树常用的遍历方式有:前序遍历、中序遍历、后序遍历、层序遍历四种遍历方式,不同的遍历算法,其思想略有不同,我们来看一下这四种遍...

wy749929317的博客 3967

open-web UI 实用指南

open-web UI 类似于chatgpt的界面,可以私有化模型本地部署,也可以用商业模型.本文只是用开源模型. 它以实现多模态AI聊天 , AI 翻译 , 语音转文本, 文本转语音, 文生图,代码助手,可谓利器。

szmars的博客 3万+

数据结构—二叉树的4种遍历方式详解以及Java代码的完整演示

本文介绍了4种二叉树的遍历方法,分别是前序、中序、后续、层序遍历,并且每种方法均提供了详尽的Java语言的代码演示,在最后还介绍了遍历结果推导的方法。

终生学习践行者 1万+

Arxml文件可视化:当汽车软件架构遇见交互式设计工具

本文探讨了Arxml文件在汽车电子系统开发中的可视化技术,结合AUTOSAR架构标准,介绍了如何利用现代Web技术构建交互式设计工具。通过三维组件关系图、动态数据流展示和版本对比等功能,显著提升开发效率和架构评审质量,适用于MBD和ASPICE开发流程。

weixin_29050271的博客 429

Halcon实战:5分钟搞定线序颜色检测(附完整代码解析)

本文详细介绍了如何使用Halcon在5分钟内实现工业级线序颜色检测的高效方案。通过机器视觉技术,结合实战项目经验,提供完整的代码解析和优化技巧,帮助开发者快速构建鲁棒性强、准确率高的检测系统,适用于电子制造和汽车线束等行业。

weixin_29098367的博客 441

二叉树遍历算法及其应用

/如果是空树,则结果返回 0,递归结束//左子树的节点数+右子树的结点数+根结点数(1)

m0_61077415的博客 309

R分析|怎么样使用piecewiseSEM构建结构方程模型?保姆级教程

计算科学的发展让我们有了更先进的工具揭示自然规律。结构方程模型(SEM)已被广泛应用于多学科进行数据挖掘。其中在R中实现的结构方程模型是方便快捷的。今天要介绍的piecewiseSEM包就是R中实现SEM的一种方式。piecewiseSEM被开发出来主要目的是为了解决复杂模型简化后进行分段分析。个人认为最大的特点是更灵活,且采用的是原始数据,并不是传统的协方差矩阵。其次,将SEM破碎化为多个独立的方程,对样本量要求较少。

weixin_46814750的博客 6941

二叉树的结构及其遍历算法

1.BinaryTree.java /** * 前序遍历二叉树。先根结点,再左结点, * 如无再右结点,如此递归至搜索完毕。 */ package com.binarytree; public class BinaryTree { int data; BinaryTree leftpoiter; BinaryTree rightpoiter; BinaryTree...

Code loading 147

WPF 上位机可视化天花板:HandyControl 搭建 SCADA 系统

HandyControl 凭借「丰富的工业级控件、灵活的主题定制、优异的性能」,成为 WPF 开发 SCADA 系统的首选 UI 库。本文搭建的 SCADA 系统涵盖实时监控、设备控制、报警管理、趋势分析四大核心功能,通过 HandyControl 实现了工业级可视化效果,开发效率提升 60% 以上。控件开箱即用:无需自定义仪表盘、趋势图、指示灯等 SCADA 核心控件;可视化效果专业:工业风主题、动态颜色切换、清晰的状态呈现,契合工业场景需求;

这里只有干货:从 Modbus 通信到 MES 对接,从 YOLO 训练到工控机部署,带你搞定工业软件开发全流程。 1126

STM32F407中文手册

STM32f407中文手册 本参考手册面向应用开发人员,提供有关使用 STM32F405xx/07xx、STM32F415xx/17xx、 STM32F42xxx 和 STM32F43xxx 微控制器存储器与外设的完整信息。STM32F405xx/07xx、STM32F415xx/17xx、STM32F42xxx 和 STM32F43xxx 构成一个微 控制器系列,各产品具有不同的存储器大小、封装和外设。有关订购信息以及器件的机械与电气特性,请参见数据手册。有关 ARM Cortex™-M4F 内核的信息,请参见《Cortex™-M4F 技术参考手册》。

二叉树的构建及其遍历算法

概要二叉树是一种非常重要的数据结构,很多其他数据机构都是基于二叉树的基础演变过来的。二叉树有先、中、后,层次四种遍历方式,因为树的本身就是用递归定义的,因此采用递归的方法实现三种遍历,不仅代码简洁且容易理解,但其开销也比较大,而若采用非递归方法实现先中后3种遍历,则要用栈来模拟实现(递归也是用栈实现的)。下面先简要介绍先中后三种遍历方式的递归实现,再详细介绍先中后三种遍历方式的非递归实现与层次遍历。

戴璞微的学习之路 2891

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

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

二叉树及其所有遍历算法详解

递归创建二叉树 二叉树遍历 先序遍历递归算法 中序遍历递归算法 后序遍历递归算法 先序遍历非递归算法 中序遍历非递归算法 层序遍历算法

Dream_begin_的博客 483

迈瑞BS系列全自动生化分析仪LIS协议接口手册(内含HL7和ASTM)

迈瑞BS系列全自动生化分析仪LIS协议接口手册,内含HL7和ASTM)

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

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

二叉树层次遍历算法及其应用(求二叉树深度、宽度、自下而上、从右到左的层次遍历算法)

层次遍历算法 1、求二叉树深度2、求二叉树宽度3、求指定某一层k的叶子节点数4、自下而上,从右到左的层次遍历

weixin_44379678的博客 1107

Java实现一棵二叉树的构建以及其深度优先遍历算法

Java实现二叉树 树这个数据结构在平时的实际开发中其实十分常见,例如,要表示级联关系时,通常使用树来表达。 例如,生活中的家族族谱关系,组织架构之间的关系,系统菜单中的级联关系,省市区的一对多关系,业务数据的父子关系等,可见,掌握树的基本数据结构以及如何去应用他,对我们平时的开发是十分有利的。 树的定义 树是 n 个节点的有限集,这里n>=0。当n=0时,称之为一棵空树。 树的特点 有且仅有一个特定的称为根的节点。 当n>1时,其余的节点可分为 m 个互不相交的有限集,每一个集合本身又是

阿鹏的博客 668

数据结构与算法(八)树和二叉树及其遍历算法

逻辑结构:非线性结构(一对多,一个前驱多个后继)、具有层次关系 树(Tree)是n(n≥0)个结点的有限集

就随便写写.... 564

【C语言数据结构】二叉树及其遍历算法

【代码】【C语言数据结构】二叉树及其遍历算法。

weixin_57807777的博客 301

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

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

TianYao 7924

第十一周项目1验证算法(1)层次遍历算法的验证

/* Copyright (c)2015,烟台大学计算机与控制工程学院 All rights reserved. 文件名称:十一周项目1(1).cpp 作 者:彭子竹 完成日期:2015年11月13日 版 本 号:v1.0 问题描述:实现二叉树的层次遍历算法,并对用”A(B(D,E(H(J,K(L,M(,N))))),C(F,G(,I)))”创建的二叉树进行测试。

pzz19960418的博客 443

二叉树的遍历以及遍历算法的应用(链式存储结构)

目录一、二叉树的遍历(递归算法)1.1 DLR先序遍历1.2 LDR中序遍历1.3 LRD中序遍历二、遍历算法的应用2.1 输出二叉树中的结点2.2 输出二叉树中的叶结点 2.3 统计叶结点数目2.4 二叉树的创建2.4.1 介绍:先序定位串2.4.2 算法实现2.5 二叉树的销毁2.6 求二叉树的高度 1.2 LDR中序遍历 1.3 LRD中序遍历 二、遍历算法的应用 2.1 输出二叉树中的结点 2.2 输出二叉树中的叶结点 2.3 统计叶结点数目

狂放不羁霸的博客 1816
上一篇: 递归算法
下一篇: 图的存储结构及遍历算法
小飞鱼hubble
博客等级 码龄15年 14粉丝 8原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值