数据结构-----二叉树的创建和遍历

news2024/12/23 16:48:10

 目录

前言

二叉树的链式存储结构 

二叉树的遍历

 1.前序遍历

2.中序遍历

3.后序遍历

 二叉树的创建

创建一个新节点的函数接口

1.创建二叉树返回根节点 

2.已有根节点,创建二叉树

3.已有数据,创建二叉树


前言

        在此之前我们学习了二叉树的定义和储存方式,还学了一种特殊的二叉树---堆,那今天我们就正式开始去学习二叉树了,是通过链式结构储存的二叉树,下面我会详细讲解二叉树的创建和遍历方法。

相关链接

二叉树的基础知识点:数据结构-----树和二叉树的定义与性质_Gretel Tade的博客-CSDN博客

堆的相关方法代码实现:数据结构-----堆(完全二叉树)_Gretel Tade的博客-CSDN博客

二叉树的链式存储结构 

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

typedef char ElemType;
typedef struct binarytreenode {
	ElemType data;	//数据域
	struct binarytreenode* left;	//左指针 
	struct binarytreenode* right;	//右指针
}BTnode;

二叉树的遍历

 这里就会有人问了,咦二叉树都没创建呢,就开始学遍历?别急,下面听我慢慢说,二叉树的创建是要利用的遍历的,这么说吧,遍历是贯穿整个二叉树的基础,没有遍历,就不会有二叉树。二叉树的遍历分三种:前序遍历中序遍历后序遍历,下面我们接着看。

 1.前序遍历

在一个二叉树中,前序遍历就是按照二叉树的外围跑一圈,所以从根节点开始,然后到左节点,跑完全部的左节点,就进入到右节点,最后回到根部节点。如下图所示:

前序遍历的顺序为:根左右

前序遍历结果为: A B D H I E J C F K G 

 动图演示:

 代码实现

//1.二叉树的前序遍历
void Btree_prev(BTnode* T) {	//T 是这个树的根节点
	if (!T) {
		return;
	}
	printf("%c ", T->data);		//先输出遍历结果	
	Btree_prev(T->left);		//左边节点进入递归
	Btree_prev(T->right);		//右边节进入递归
}

2.中序遍历

中序遍历可以看作是,这个二叉树上的每一个节点垂直落下来,最后排成一排就是遍历完成的结果,如下图所示:

中序遍历的顺序为:左根右 

中序遍历结果:H D I B E J A F K C G 

 代码实现

//2.二叉树的中序遍历
void Btree_mid(BTnode* T) {  //T 是这个树的根节点
	if (!T) {
		return;
	}
	Btree_prev(T->left);
	printf("%c ", T->data);
	Btree_prev(T->right);
}

3.后序遍历

后序遍历可以看作是一个摘葡萄的过程,先是把下面的葡萄摘完,然后再去摘上面的葡萄,也就是把子节点遍历完成了之后,最后去遍历根节点。如下图所示:

 后序遍历的顺序为:左右根 

后序遍历的结果:H I D J E B K F G C A 

代码实现:

//3.后续遍历
void Btree_final(BTnode* T) {	//T 是这个树的根节点
	if (!T) {
		return;
	}
	Btree_final(T->left);
	Btree_final(T->right);
	printf("%c ", T->data);
}

 二叉树的创建

        先学会了二叉树的遍历,我们才可以去接着学习怎么来创建一个二叉树。创建二叉树是边遍历边创建的,在创建的过程中遍历,在遍历的过程中创建。二叉树的创建可以通过前面的三种遍历方式去创建,前序遍历、中序遍历、后序遍历都可以去创建一个二叉树,只是长相不太相同,这里我主要去通过前序遍历来创建二叉树,如果你们想通过其他两种方法只需要把代码稍微修改一下就可以实现了,下面我会详细讲解创建二叉树的常见三种写法。

概要说明:

在创建一个二叉树时,我获取到的字符序列是  ABD#E###CF### ,其中#是表示空节点的,字母是表示有数据的节点  那么这个二叉树前序遍历创建后的样子应该如下所示:

创建一个新节点的函数接口

//创建一个新节点函数接口
BTnode* Create_node(ElemType data) {
	BTnode* new_node = (BTnode*)malloc(sizeof(BTnode));
	if (!new_node) {
		printf("ERROR\n");
		exit(-1);
	}
	//依次赋值初始化
	new_node->data = data;
	new_node->left = NULL;
	new_node->right = NULL;
	return new_node;
}

下面我就开始介绍创建二叉树的三种常见写法。  

1.创建二叉树返回根节点 

//创建二叉树返回根节点
BTnode* Create_btree_2() {
	char ch;
	ch = getchar();
	BTnode* root = NULL;
	while (ch == ' ')//输入空格无效,重新输入
	{
		printf("请重新输入\n");
		scanf("%c", &ch);
	}
	if (ch != '#')
	{
		root = Create_node(ch);
		root->left = Create_btree_2();	//左节点递归创建
		root->right = Create_btree_2();	//右节点递归创建
	}
	return root;
}

2.已有根节点,创建二叉树

//传入根节点,然后进行创建
void Create_btree_3(BTnode** T) {
	char ch;
	scanf("%c",&ch);
	while(ch==' ')	//输入空格无效,重新输入
	{
		printf("请重新输入\n");
		scanf("%c", &ch);
	}
	if (ch == '#')
		(*T) = NULL;
	else {
		(*T) = Create_node(ch);
		Create_btree_3(&(*T)->left);
		Create_btree_3(&(*T)->right);
	}
}

3.已有数据,创建二叉树

对比上面前两种写法不同,这个是已有数据的情况下,通过这个数据来去创建这个二叉树,而上面两种方法是边输入边创建二叉树。

//00_1已有数据,然后创建二叉树,返回根节点
BTnode* Create_btree_1(ElemType *&data){	//&data对变量的引用
	BTnode* node=NULL;
	if (*data!='#' && data!= NULL) {
		node = Create_node(*data);
		node->left = Create_btree_1(++data);
		node->right = Create_btree_1(++data );
	}
	return node;
}

 注意:这里要用到对变量的引用(取别名)来创建,否则会出现错误

 好了,以上就是本期的全部内容了,下一期我们接着学习二叉树的相关操作方法,下次见咯!

分享一张壁纸: 

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1044549.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

HTML5+CSS3小实例:脉冲波纹催眠动画特效

实例:脉冲波纹催眠动画特效 技术栈:HTML+CSS 效果: 源码: 【html】 <!DOCTYPE html> <html><head><meta http-equiv="content-type" content="text/html; charset=utf-8"><meta name="viewport" content=&qu…

ThingsBoard 前端项目背景图片部件开发

前言 ThingsBoard 是目前 Github 上最流行的开源物联网平台&#xff08;14.4k Star&#xff09;&#xff0c;可以实现物联网项目的快速开发、管理和扩展, 是中小微企业物联网平台的不二之选。 本文介绍如何在 ThingsBoard 前端项目中开发背景图片部件。 产品需求 最近接到产…

掌握可扩展和可维护应用程序:12-Factor应用程序开发的全面指南

1*vhxOhTuKSyuuAKu-nUQ5SA.jpeg 在今天的快节奏世界中&#xff0c;软件开发人员需要创建可扩展、可维护和适应性强的应用程序。12-Factor应用程序方法论是一组最佳实践&#xff0c;可以帮助开发人员实现这些目标。 本文深入探讨了12个因素&#xff0c;详细解释了它们的重要性以…

python 深度学习 解决遇到的报错问题5

目录 一、conda安装shapefile失败 二、conda安装osmnx失败&#xff1a;To search for alternate channels that may provide the conda package yourelooking for, navigate to 三、ERROR: Could not build wheels for llvmlite, which is required to install pyproject.to…

算法基础--位运算

一、常见位运算总结&#xff1a; 1、基础位运算&#xff08;^&#xff09; 其中异或^有2种理解。 2、位图bitset相关&#xff08;&|&#xff09; test判断第x位是1函数0: 可以让n右移&#xff0c;也可以让1左移&#xff0c;习惯上选择第一种 (n>>x)&1 判…

初创企业应该选一款怎样的客服系统?

互联网经济时代的飞速发展&#xff0c;促使客户市场对于企业服务的要求越来越高。客户在选择产品的时候已经不单单却决于产品功能和价格&#xff0c;客户服务也是其关注的重点。 优质的客户服务所带来的是客户满意度的提升&#xff0c;以及品牌影响力的提高。所以&#xff0c;…

Linux 服务器下 pypy 下载数据集

Linux 服务器下 pypy 下载数据集 安装 pip install bypy链接自己的百度网盘 命令行直接输入 byby info 就行 byby info查看网盘里面的内容 bypy listbyby list 只显示自动生成的bypy中的文件&#xff0c;上传也是在这个目录中&#xff0c;可以自己在里面新建文件夹 4. 上传…

tsar-性能监控工具

简介 tsar是淘宝自己开发的一个采集工具&#xff0c;主要用来收集服务器的系统信息&#xff08;如cpu&#xff0c;io&#xff0c;mem&#xff0c;tcp等&#xff09;&#xff0c;以及应用数据&#xff08;如squid haproxy nginx等&#xff09;。收集到的数据存储在磁盘上&#…

SMOKE-CMAQ实践技术应用

大气污染物排放是空气污染的源头&#xff0c;气象因素是影响污染程度的重要因素&#xff0c;因此空气质量模式要求气象资料和污染物排放清单作为输入&#xff0c;其中由于大气污染源复杂性、数据滞后性、动态变化、规律性不明显等特点&#xff0c;使得大气污染源排放清单输入准…

【牛客网】OR63 删除公共字符串

思路 创建哈希表,将第二个字符串中出现过的字符添加到哈希表中创建StringBuffer来拼接最后的结果字符串遍历字符串一,如果字符在哈希表中出现过,就不拼接到字符串中,反之则拼接 Java代码 import java.util.*;// 注意类名必须为 Main, 不要有任何 package xxx 信息 public cl…

ISIS的高级特性

1、IS-IS邻接关系建立原则 L1的路由器只能和L1的路由器建立邻接关系&#xff0c;也可以和L1、2的路由建立邻接关系 L2的路由器只能和L2的路由器建立邻接关系&#xff0c;也可以和L1、2的路由建立邻接关系 DIS只有在广播型网络中才会选举 LSP相当于OSPF中的LSA IS-IS链路状态报文…

JUC第十讲:CAS,Unsafe和原子类详解

JUC第十讲&#xff1a;CAS,Unsafe和原子类详解 JUC中多数类是通过volatile和CAS来实现的&#xff0c;CAS本质上提供的是一种无锁方案&#xff0c;而Synchronized和Lock是互斥锁方案; java原子类本质上使用的是CAS&#xff0c;而CAS底层是通过Unsafe类实现的。本文是JUC第十讲&a…

广东海颐开发笔试编程题回顾

题目一 1、现以序列{22, 24, 30, 14, 10, 17, 15, 20, 16, 23}的顺序进行输入&#xff0c;请画出构造出的平衡二叉树?请写出实现二叉树左旋的代码?&#xff08;具体题目忘记了&#xff0c;就随机搞个排序&#xff0c;思路和方法都是一样的&#xff09; 图 顺序 {22, 14, 10…

【C++】多态,从使用到底层。

文章目录 前言一、多态的概念二、多太的定义和实现2.1 多太的构造条件2.2 虚函数2.3 重写(覆盖)2.4 C11 override 和 final2.5 重载&#xff0c;隐藏&#xff0c;重写 三、多态的原理3. 1虚函数表3.2 虚函数表如何完成多态的功能3.3 虚函数表存储在内存空间的那个区域&#xff…

服务断路器_Resilience4j超时降级

创建模块cloud-consumer-resilience4j-order80 POM引入依赖 <dependencies><!-- 引入Eureka 客户端依赖 --><dependency><groupId>org.springframework.cloud</groupId><artifactId>spring-cloud-starter-netflix-eureka-client</a…

【Java 进阶篇】数据库介绍与MySQL详细介绍

数据库是信息科技领域中不可或缺的一部分&#xff0c;它们在我们日常生活中扮演着重要的角色&#xff0c;从手机应用到云计算&#xff0c;无处不在。在本篇博客中&#xff0c;我们将深入探讨数据库的基本概念以及MySQL这一流行的开源关系型数据库的详细信息。不需要数据库专业知…

AI写作生成器-AI写作生成器下载和用途

在当今数字化的时代&#xff0c;AI写作生成器已经成为了各行各业的创作者、企业家和学生的得力助手。这些智能工具以其强大的自然语言处理技术&#xff0c;正在解决着许多用户的写作难题。本文将深入探讨AI写作生成器&#xff0c;以及它如何在不同领域解决用户的写作问题。 147…

【算法分析与设计】递归与分治策略

目录 一、学习要点二、算法总体思想三、递归的概念例1 阶乘函数例2 Fibonacci数列例3 Ackerman函数例4 整数划分问题例5 Hanoi塔问题递归小结 四、分治法1、分治法的适用条件2、二分搜索技术3、大整数的乘法4、Strassen矩阵乘法5、棋盘覆盖6、合并排序7、快速排序8、线性时间选…

嵌入式 - 经典的有刷电机和先进的无刷电机

自从无刷直流电机诞生&#xff0c;“古老的”有刷电机就开始没落&#xff0c;但它依然是低成本应用的可靠选择&#xff0c;并且实现起来简单。 在有刷电机中&#xff0c;磁极方向的跳转是通过移动固定位置的接触点来完成的&#xff0c;该接触点在电机转子上与电触点相对连接。这…

无法从 /var/lib/rpm 打开软件包数据库

使用yum命令安装软件包时&#xff0c;报错“无法从 /var/lib/rpm 打开软件包数据库” 小白教程&#xff0c;一看就会&#xff0c;一做就成。 1.原因 是误操作导致 rpm 数据库损坏。&#xff08;/var/lib/rpm 目录下的文件被损坏&#xff09; 2.解决 当RPM 数据库发生损坏&a…