【数据结构】二叉树的遍历

news2025/7/9 0:06:16

目录

  • ☀️二叉树的构建
  • ☀️二叉树的遍历
    • 🌻前序遍历
    • 🌻中序遍历
    • 🌻后序遍历
  • ☀️完整代码展示


☀️二叉树的构建

便于理解二叉树的遍历,这里我们手动简单构建一个二叉树,当然,此处二叉树的构建并不是真正二叉树的构建方式,仅仅作为对本文所讲的二叉树遍历的一个参考。

代码如下:

typedef int BTDatatype;
typedef struct TreeNode
{
	BTDatatype data;
	struct TreeNode* left;
	struct TreeNode* right;
}BTNode;

BTNode* BuyBTNode(BTDatatype x)
{
	BTNode* newnode = (BTNode*)malloc(sizeof(BTNode));
	if (newnode == NULL)
	{
		perror("malloc fail");
		exit(-1);
	}
	newnode->data = x;
	newnode->left = NULL;
	newnode->right = NULL;
	return newnode;
}
int main()
{
	BTNode* n1 = BuyBTNode(1);
	BTNode* n2 = BuyBTNode(2);
	BTNode* n3 = BuyBTNode(3);
	BTNode* n4 = BuyBTNode(4);
	BTNode* n5 = BuyBTNode(5);
	BTNode* n6 = BuyBTNode(6);
	n1->left = n2;
	n2->left = n3;
	n1->right = n4;
	n4->left = n5;
	n4->right = n6;
	return 0;
}

所构建的二叉树图如下所示:
在这里插入图片描述

☀️二叉树的遍历

🌻前序遍历

前序遍历也称为先根遍历,依次访问二叉树的根节点、左子树、右子树。

对本文所构建的二叉树进行前序遍历的顺序为:

1 -> 2 -> 3 -> NULL -> NULL -> NULL -> 4 -> 5 -> NULL -> NULL -> 6 -> NULL -> NULL

代码如下:

void PrevOrder(BTNode* root)
{
	if (root == NULL)
	{
		printf("NULL ");
		return;
	}
	printf("%d ", root->data);
	PrevOrder(root->left);
	PrevOrder(root->right);
}

结合本文所构建的二叉树运行的结果:
在这里插入图片描述


🌻中序遍历

中序遍历也称为中根遍历,依次访问二叉树的左子树、根节点、右子树。

对本文所构建的二叉树进行中序遍历的顺序为:

NULL -> 3 -> NULL -> 2 -> NULL -> 1 -> NULL -> 5 -> NULL -> 4 -> NULL -> 6 -> NULL

代码如下:

void InOrder(BTNode* root)
{
	if (root == NULL)
	{
		printf("NULL ");
		return;
	}
	InOrder(root->left);
	printf("%d ", root->data);
	InOrder(root->right);
}

结合本文所构建的二叉树运行的结果:
在这里插入图片描述


🌻后序遍历

中序遍历也称为后根遍历,依次访问二叉树的左子树、右子树、根节点。

对本文所构建的二叉树进行后序遍历的顺序为:

NULL -> NULL -> 3 -> NULL -> 2 -> NULL -> NULL -> 5 -> NULL -> NULL -> 6 -> 4 -> 1

代码如下:

void PostOrder(BTNode* root)
{
	if (root == NULL)
	{
		printf("NULL ");
		return;
	}
	PostOrder(root->left);
	PostOrder(root->right);
	printf("%d ", root->data);
}

结合本文所构建的二叉树运行的结果:
在这里插入图片描述

☀️完整代码展示

#include <stdio.h>
#include <stdlib.h>
typedef int BTDatatype;
typedef struct TreeNode
{
	BTDatatype data;
	struct TreeNode* left;
	struct TreeNode* right;
}BTNode;

BTNode* BuyBTNode(BTDatatype x)
{
	BTNode* newnode = (BTNode*)malloc(sizeof(BTNode));
	if (newnode == NULL)
	{
		perror("malloc fail");
		exit(-1);
	}
	newnode->data = x;
	newnode->left = NULL;
	newnode->right = NULL;
	return newnode;
}
//前序遍历
void PrevOrder(BTNode* root)
{
	if (root == NULL)
	{
		printf("NULL ");
		return;
	}
	printf("%d ", root->data);
	PrevOrder(root->left);
	PrevOrder(root->right);
}
//中序遍历
void InOrder(BTNode* root)
{
	if (root == NULL)
	{
		printf("NULL ");
		return;
	}
	InOrder(root->left);
	printf("%d ", root->data);
	InOrder(root->right);
}
//后序遍历
void PostOrder(BTNode* root)
{
	if (root == NULL)
	{
		printf("NULL ");
		return;
	}
	PostOrder(root->left);
	PostOrder(root->right);
	printf("%d ", root->data);
}
int main()
{
	BTNode* n1 = BuyBTNode(1);
	BTNode* n2 = BuyBTNode(2);
	BTNode* n3 = BuyBTNode(3);
	BTNode* n4 = BuyBTNode(4);
	BTNode* n5 = BuyBTNode(5);
	BTNode* n6 = BuyBTNode(6);
	n1->left = n2;
	n1->right = n4;
	n2->left = n3;
	n4->left = n5;
	n4->right = n6;
	//前序遍历
	PrevOrder(n1);
	printf("\n");
	//中序遍历
	InOrder(n1);
	printf("\n");
	//后序遍历
	PostOrder(n1);
	printf("\n");
	return 0;
}

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

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

相关文章

C++类与对象(一)

目录 一、面向过程和面向对象认识 二、类的引入 三、类的定义 类的两种定义方式&#xff1a; 四、类的访问限定符及封装 4.1 访问限定符 4.2 封装 五、类的作用域 六、类的实例化 七、类对象模型 7.1 如何计算类对象的大小​​​​​ 7.2 类对象的存储方式 7.3 结…

SpringBoot+Mybaits搭建通用管理系统实例十一:数据缓存功能实现

一、本章内容 使用ehcache实现系统缓存功能,并配置实现mybatis的二级缓存,自定义分页缓存的key,识别实体类型,并根据实体属性的配置,组合生成key值用于标识缓存数据。 完整课程地址二、开发视频 SpringBoot+Mybaits搭建通用管理系统实例三:缓存管理功能实现 三、缓存配置 …

滚动吧,数字

朋友有个需求关于金币滚动效果&#xff0c;网上也有很多教程&#xff1b;但多不太符合他的需求&#xff0c;所有利用空余时间帮他做了一个通用组件。 效果图如下: 1、按照次数和速度进行&#xff0c;对应的滚动效果。 2、缓动效果可以根据自己的情况进行修改。 项目地址&#x…

windows安装VMware虚拟机(附带CentOS7部署)

软件下载 链接&#xff1a;https://pan.baidu.com/s/1Vw2Bilf9uf-EYR6_MR86aA?pwdd2qr 提取码&#xff1a;d2qr VMware安装 通你上述链接下载VMware安装包&#xff0c;没有特别选项&#xff0c;选安装位置无脑下一步安装&#xff0c;安装完成后会提示你输入激活码&#xf…

Java中的OpenCV-图像处理

我们将在本文中介绍以下高级图像处理操作&#xff1a;Canny 边缘检测轮廓和形状识别Canny 边缘检测&#xff1a;Canny 边缘检测是一种流行的边缘检测算法。它是由 John F. Canny 在 1986 年开发的。它是一个多阶段算法&#xff0c;我们将按如下方式经历每个阶段&#xff1a;噪声…

Java与GitLab OpenAPI交互

通过Gitlab Open api代码来操作代码的合并及关闭&#xff0c;项目的模板生成........ 方式一&#xff1a; 使用java-gitlab-api(推荐) 接口文档Java Gitlab API Documentation <dependency> <groupId>org.gitlab</groupId> <art…

49 多个 classloader 加载的同类限定名的Class 在 jhat 中显示不全

前言 呵呵 这是在之前 排查一个 flink 的相关问题的时候 发现的一个问题 flink 默认的 job 隔离是基于 Classloader 来进行隔离的 直到 最近才有时间来看一下 这个问题的原因, 究其代码 也还是比较容易找到 大致记录一下 以下内容, 截图 基于 jdk8 测试用例 /*** …

要闻 | 人大金仓重磅亮相2022南京软博会

“软件赋能 数智转型”&#xff0c;2022中国&#xff08;南京&#xff09;国际软件产品和信息服务交易博览会&#xff08;下称“南京软博会”&#xff09;于11月23至25日顺利举行。人大金仓重磅亮相本次展会&#xff0c;并受邀出席同期召开的2022中国&#xff08;南京&#xff…

【LeetCode每日一题】——37.解数独

文章目录一【题目类别】二【题目难度】三【题目编号】四【题目描述】五【题目示例】六【解题思路】七【题目提示】八【时间频度】九【代码实现】十【提交结果】一【题目类别】 数组 二【题目难度】 困难 三【题目编号】 37.解数独 四【题目描述】 编写一个程序&#xff…

抢先看!阿里发布2023最新版分布式核心小册,GitHub标星破已千万

什么是分布式 一个分布式系统你可以看做是一组计算机系统一起工作&#xff0c;而在终端用户的视角看过去&#xff0c;就像一台计算机在工作一样 。 这组一起工作的计算机&#xff0c;拥有共享的状态 &#xff0c;他们同时运行&#xff0c;独立机器的故障不会影响整个系统的正常…

1、认识时间复杂度和简单的排序算法

目录时间复杂度选择排序冒泡排序异或交换解释案例综上插入排序二分查找拓展对数器时间复杂度 如果一个操作时间和数据量没有关系&#xff0c;则是常数时间的操作 比如一个数组arr[n]这就是算一个偏移量&#xff0c;然后找到这个位置的值&#xff0c;这就是常数时间&#xff0c…

力扣(LeetCode)882. 细分图中的可到达节点(C++)

spfa 将边细分成节点&#xff0c;如果一条边细分出 nnn 个结点&#xff0c;那么边的两个端点距离 n1n1n1 &#xff0c;边长 n1n1n1。提示中给出&#xff0c;一共 300030003000 个初始结点&#xff0c;无向边的数目小于等于 100001000010000 &#xff0c;这是提示我们最多有 20…

服务器怎么远程连接控制

服务器怎么远程连接控制 我是艾西&#xff0c;还是有很多小白同学问我服务器怎么远程连接。那么今天我们重点来教教大家如何用电脑远程服务器配上图文教程&#xff0c;让不懂的新手小白一看就会&#xff0c;分分钟上手教程 远程服务器需要一台电脑俗称“PC”就是我们自己平时经…

红外遥控视力自动检测系统的设计与实现

红外线视力检测系统的设计与实现 实现方法 分为两部分 上位机-------------串口通讯-------------下位机 上位机&#xff1a;使用LabVIEW软件编写窗口软件。 串口通讯&#xff1a;USB线进行链接通讯。 下位机&#xff1a;AT89C52单片机开发板 说明&#xff1a;Labvi…

46-pytest-分布式插件pytest-xdist使用

分布式插件pytest-xdist使用前言安装插件分布式用例设计原则使用示例测试报告按一定顺序执行前言 本篇来学习下在pytest中分布式执行测试用例&#xff0c;以节省测试时间。 安装插件 pip install pytest-xdist分布式用例设计原则 用例之间是独立的&#xff0c;用例之间没有…

学生护眼台灯哪个牌子最好?2022双十二4款儿童护眼写字灯推荐

现在的孩子学业压力越来越大了&#xff0c;眼睛也是长期高强度使用&#xff0c;不堪重负&#xff0c;如果不注意保护&#xff0c;加上年龄偏小身体器官尚未发育完全&#xff0c;极易出现各种眼睛问题。所以对于经常晚上看书写字的学生群体来说&#xff0c;有一个健康护眼的照明…

OpenGL ES 学习(二) -- 渲染模式和GLSL

上一章&#xff0c;我们学习了 OpenGL 的基本知识&#xff0c;这一章&#xff0c;一起学习OpenGL的渲染模式和渲染语言GLSL。 一. 渲染流程 OpenGL的渲染流程如下图所示&#xff1a; 从这里看出&#xff0c;OpenGL 需要使用顶点着色器&#xff0c;先绘制好轮廓&#xff0c;再…

Java面向对象之——多态

文章目录一、多态的概念二、多态的条件三、重写四、向上转型和向下转型1、向上转型2、向下转型五、再谈多态六、多态的优缺点总结一、多态的概念 多态是同一个行为具有多个不同表现形式或形态的能力。就比如人吃饭&#xff0c;对于中国人使用筷子吃饭&#xff0c;美国人使用刀…

C. Almost All Multiples(贪心 + 思维)

Problem - C - Codeforces 给定两个整数n和x&#xff0c;如果pi是i的倍数&#xff0c;所有1≤i≤n-1&#xff0c;pn1&#xff0c;且p1x&#xff0c;则长度为n的排列组合† p被称为搞笑。 找出最小的有趣的排列组合&#xff0c;或报告说不存在这样的排列组合。 † 长度为n的排…

分布式学习必看:十年架构大佬带你从零开始学习分布式服务框架!

前言 最近在看《架构探险-从零开始写分布式服务框架》&#xff0c;对于分布式框架的入门级选手还是挺合适的&#xff0c;扫盲。对分布式服务框架中的基本概念&#xff1a;RPC、SOA、序列化、Spring集成RPC、ZooKeeper、I/O模型、Netty、软负载、服务治理做了系统介绍。手写了R…