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

news2025/2/27 23:20:55

目录

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

一、中序遍历

二、后序遍历

三、前序遍历

C++代码


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

我们知道线性数组或链表都只能单向从头至尾遍历或反向遍历。所谓二叉树的遍历(Binary Tree Traversal),简单的说法就是访问树中所有的节点各一次,并且在遍历后将树中的数据转化为线性关系。对于一棵简单的二叉树节点来说,每个节点都可分为左、右两个分支,可以有ABC、ACB、BAC、BCA、CAB和CBA六种遍历方法。

如果按照二叉树的特性,一律从左向右遍历,就只剩下3种遍历方式,分别是BAC、ABC、BCA。这三种方式的命名与规则如下:

  1. 中序遍历(Inorder Traversal,BAC):左子树--树根--右子树
  2. 前序遍历(Preorder Traversal,ABC):树根--左子树--右子树
  3. 后序遍历(Postorder Traversal,BCA):左子树--右子树--树根

对于这3种遍历方式,大家只需要记住树根的位置,就不会把前序、中序和后序搞混了。例如,中序法是树根在中间,前序法是树根在前面,后序法是树根在后面,遍历方式都是先左子树后右子树。

一、中序遍历

中序遍历是“左中右”的遍历顺序,也就是从树的左侧逐步向下方移动,直到无法移动,再访问此节点,并向右移动一个节点。如果无法再向右移动,就可以返回上层的父节点,并重复左、中、右的步骤进行。

  1. 遍历左子树
  2. 遍历树根
  3. 遍历右子树
	void Inorder(TreeNode* tempTree) {
		if (tempTree != nullptr) {
			Inorder(tempTree->leftNode);
			cout << tempTree->data << " ";
			Inorder(tempTree->rightNode);
		}
	}

二、后序遍历

后序遍历是“左右中”的遍历顺序,即先遍历左子树,再遍历右子树,最后遍历(或访问)根节点,反复执行此步骤。

  1. 遍历左子树
  2. 遍历右子树
  3. 遍历树根
	void Postorder(TreeNode* tempTree) {
		if (tempTree != nullptr) {
			Postorder(tempTree->leftNode);
			Postorder(tempTree->rightNode);
			cout << tempTree->data << " ";
		}
	}

三、前序遍历

前序遍历是“中左右”的遍历顺序,也就是先从根节点遍历,再往左方移动,当无法继续时,继续向右方移动,接着重复执行此步骤。

  1. 遍历树根
  2. 遍历左子树
  3. 遍历右子树
	void Preorder(TreeNode* tempTree) {
		if (tempTree != nullptr) {
			cout << tempTree->data << " ";
			Preorder(tempTree->leftNode);
			Preorder(tempTree->rightNode);
		}
	}

C++代码

#include<iostream>
using namespace std;

struct TreeNode {
	int data;
	TreeNode* leftNode;
	TreeNode* rightNode;
	TreeNode(int tempData, TreeNode* tempLeftNode = nullptr, TreeNode* tempRightNode = nullptr) {
		this->data = tempData;
		this->leftNode = tempLeftNode;
		this->rightNode = tempRightNode;
	}
};

class Tree {
private:
	TreeNode* treeNode;
public:
	Tree() {
		treeNode = nullptr;
	}
	TreeNode* GetTreeNode() {
		return this->treeNode;
	}
	void AddNodeToTree(int* tempData, int tempSize) {
		for (int i = 0; i < tempSize; i++) {
			TreeNode* currentNode;
			TreeNode* newNode;
			int flag = 0;
			newNode = new TreeNode(tempData[i]);
			if (treeNode == nullptr)
				treeNode = newNode;
			else {
				currentNode = treeNode;
				while (!flag) {
					if (tempData[i] < currentNode->data) {
						if (currentNode->leftNode == nullptr) {
							currentNode->leftNode = newNode;
							flag = 1;
						}
						else
							currentNode = currentNode->leftNode;
					}
					else {
						if (currentNode->rightNode == nullptr) {
							currentNode->rightNode = newNode;
							flag = 1;
						}
						else
							currentNode = currentNode->rightNode;
					}
				}
			}
		}
	}
	void Preorder(TreeNode* tempTree) {
		if (tempTree != nullptr) {
			cout << tempTree->data << " ";
			Preorder(tempTree->leftNode);
			Preorder(tempTree->rightNode);
		}
	}
	void Inorder(TreeNode* tempTree) {
		if (tempTree != nullptr) {
			Inorder(tempTree->leftNode);
			cout << tempTree->data << " ";
			Inorder(tempTree->rightNode);
		}
	}
	void Postorder(TreeNode* tempTree) {
		if (tempTree != nullptr) {
			Postorder(tempTree->leftNode);
			Postorder(tempTree->rightNode);
			cout << tempTree->data << " ";
		}
	}
};

int main() {
	int data[]{ 7,4,1,5,16,8,11,12,15,9,2 };
	cout << "原始数据:" << endl;
	for (int i = 0; i < 11; i++)
		cout << data[i] << " ";
	cout << endl;

	Tree* tree = new Tree;
	tree->AddNodeToTree(data, 11);

	cout << "前序遍历:" << endl;
	tree->Preorder(tree->GetTreeNode());
	cout << endl;
	cout << "中序遍历:" << endl;
	tree->Inorder(tree->GetTreeNode());
	cout << endl;
	cout << "后序遍历:" << endl;
	tree->Postorder(tree->GetTreeNode());
	cout << endl;
	return 0;
}

结果输出

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

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

相关文章

Aqua Data Studio 2023.1

为什么选择 Aqua Data Studio&#xff1f; 随着数据在业务中的作用不断发展&#xff0c;组织需要一种有效的方法来简化复杂的技术任务并缩小 IT 和业务团队之间的差距。 使用多个数据库平台不再复杂。使用 Aqua Data Studio 简化您的所有数据管理流程和任务&#xff1a;这是一…

[JavaWeb]——获取请求参数的方式(全面!!!)

&#x1f308;键盘敲烂&#xff0c;年薪30万&#x1f308; 目录 1.普通类型 1.1原始方式(了解) 1.2springboot方式(推荐) 2.实体类型 2.1简单实体类型 2.2实体类型里还有实体类型(内部类) 3.数组或集合类型 3.1数组 3.2集合 4.&#x1f525;JSON格式 常用 5.日期类型…

CS224W4.3——Random Walk with Restarts

我们讨论了个性化PageRank&#xff0c;它对节点与查询节点S的给定子集(即teleportation set)的接近程度进行排名&#xff0c;以及随机行走(Random Walk)&#xff0c;它对从单个起始节点到对节点接近程度进行随机行走建模。我们将演示这些算法是如何与PageRank的原始定义相关联的…

el-table树状表格末行合计

首先,由于我的表头是动态的,所以就稍微复杂一点 效果图 表头数据格式是这样的 表格的数据格式是这样的 然后用合并的方法,此处就需要递归去计算,根据props去匹配每一列的数据,然后加起来,关键代码 //合计处理getSummaries(param) {const { columns, data } param;const su…

蜂邮个人可以注册吗?注册蜂邮EDM的教程!

被问了100遍的邮件营销系统蜂邮EDM个人该怎么注册&#xff1f; 蜂邮EDM是一个强大的邮件营销系统&#xff0c;不仅适用于企业&#xff0c;个人用户也可以注册并使用。如果你一直在思考如何注册蜂邮EDM&#xff0c;不要担心&#xff0c;今天我将为你提供一份详细的注册教程&…

基于深度学习的口罩佩戴检测

欢迎大家点赞、收藏、关注、评论啦 &#xff0c;由于篇幅有限&#xff0c;只展示了部分核心代码。 文章目录 一项目简介二、功能三、基于深度学习的口罩佩戴检测四. 总结 一项目简介 基于深度学习的口罩佩戴检测是一种利用计算机视觉技术和深度学习算法进行口罩佩戴情况检测的…

小白怎么学习性能测试?一文7个知识点带你成功入门!

1.什么是性能测试 性能测试是通过自动化的测试工具模拟多种正常、峰值以及异常负载条件来对系统的各项性能指标进行测试。负载测试和压力测试都属于性能测试&#xff0c;两者可以结合进行。通过负载测试&#xff0c;确定在各种工作负载下系统的性能&#xff0c;目标是测试当负…

3.15每日一题(分部积分求不定积分)

注意看分子分母的变化&#xff0c;可以相消

mac下载安装jenkins

下载 选择2.1.64版本 &#xff08;需要jdk8&#xff0c;自行下载&#xff0c; &#xff09; https://archives.jenkins.io/war/2.164/jenkins.war 启动 使用命令行启动 java -jar jenkins.war 浏览器访问 IP:8080 或 localhost:8080 &#xff0c;对jenkins进行配置&#xf…

arcgis删除细长图斑的方法

1、有一张图斑数据如下&#xff1a; 如上图&#xff0c;有很多细长的面要素&#xff0c;需要保留的仅是图中的块状要素。 2、首先要将被合并的要素进行拆分&#xff0c;具体拆分步骤如下&#xff1a; 将所有要素选中&#xff0c;点击高级编辑中的拆分按钮。 3、拆分后图斑就…

Linux常用操作及主流服务部署命令

目录 Linux 系统目录 一、常用操作命令 1、目录操作 2、文件内容操作&#xff08;查看日志&#xff0c;更改配置文件&#xff09; 3、压缩和解压缩 4、更改文件权限 二、各服务部署命令 1、增加虚拟内存 2、JDK 2.1 删除系统自带的openjdk 2.2 安装jdk 2.3 删除jd…

【LeetCode】每日一题 2023_11_1 参加会议的最多员工数(没做出来)

文章目录 刷题前唠嗑题目&#xff1a;参加会议的最多员工数题目描述代码与解题思路纳入收藏夹 结语 刷题前唠嗑 好好好&#xff0c;这么玩是吧&#xff0c;11 月刚准备开始刷每日一题&#xff0c;就给我来了一道 hard&#xff0c;我连题目都看不懂他在讲些什么&#xff0c;但是…

深度学习_2 数据操作之数据预处理

数据操作 机器学习包括的核心组件有&#xff1a; 可以用来学习的数据&#xff08;data&#xff09;&#xff1b;如何转换数据的模型&#xff08;model&#xff09;&#xff1b;一个目标函数&#xff08;objective function&#xff09;&#xff0c;用来量化模型的有效性&…

记一次有趣的tp5代码执行

目录 0x00 前言 0x01 基础信息 0x02 突破 base64编码与php://filter伪协议 tp 5 method代码执行的细节 0x03 总结 免费领取安全学习资料包&#xff01;&#xff08;私聊进群一起学习&#xff0c;共同进步&#xff09;​编辑 0x00 前言 朋友之前给了个站&#xff0c;拿了…

一对一发放私密成绩:成绩查询系统全攻略

有没有想过让学生自助查询成绩&#xff1f;介绍一种全新的成绩查询系统&#xff0c;帮你实现一对一发放私密成绩。 一、如何用代码实现学生自助查询成绩&#xff1f; 如果你是一名懂得编程的老师&#xff0c;那么你可以考虑使用Python编写一个简单的成绩查询系统。下面是一个基…

Sqoop的安装和使用

目录 一.安装 二.导入 1.全量导入 一.MySQL导入HDFS 二.MySQL导入Hive 2.增量导入 一.过滤导入hdfs/hive 二.导出 一.安装 1.下载地址&#xff1a;sqoop下载地址 2.解压 tar -zxvf ./sqoop-1.4.7.bin__hadoop-2.6.0.tar.gz -C ../module/ 3.改名和配置归属权限 #改名…

ChatGPT将迎来巨大更新!变得无所不能!

此次更新&#xff0c;主要是2点&#xff1a; 1、直接可以与PDF和数据文件对话&#xff0c;只需上传即可完成聊天 2、不用来回切换联网、作图功能&#xff0c;已经将这些功能进行了集成&#xff0c;直接在对话中使用即可&#xff0c;比如之前的联网&#xff08;Browse with Bi…

【教程】R语言生物群落(生态)数据统计分析与绘图

查看原文>>>R语言生物群落&#xff08;生态&#xff09;数据统计分析与绘图实践 暨融合《R语言基础》、《tidyverse数据清洗》、《多元统计分析》、《随机森林模型》、《回归及混合效应模型》、《结构方程模型》、《统计结果作图》七合一版本方案 R 语言作的开源、自…

求职应聘,请问笔试题,面试题,性格测评题是什么?

各家企业的面试测评&#xff0c;可能各不相同&#xff0c;如果要想得到原题有两种办法&#xff1a; 1、做过的同学&#xff0c;记住了原题&#xff0c;也在玩知乎&#xff0c;正好看到了你的提问&#xff0c;而且他很乐意回答这个问题&#xff0c;也不嫌码字辛苦。这个概率不高…

首次实现容错量子计算机!奥地利展示量子实力

&#xff08;图片来源&#xff1a;网络&#xff09; 奥地利因斯布鲁克大学的实验物理学家首次在容错量子比特上实现通用计算&#xff0c;并演示了如何在一台量子计算机上编程。 虽然当代计算机采用了高质量的制造方法&#xff0c;大大降低了信息处理和存储过程中出现错误的概…