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

目录

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

一、中序遍历

二、后序遍历

三、前序遍历

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;
}

结果输出

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

轧钢厂安全生产方案:AI视频识别安全风险智能监管平台的设计

一、背景与需求 轧钢厂一般都使用打包机对线材进行打包作业&#xff0c;由于生产需要&#xff0c;人员需频繁进入打包机内作业&#xff0c;如&#xff1a;加护垫、整包、打包机检修、调试等作业。在轧钢厂生产过程中&#xff0c;每个班次生产线材超过300件&#xff0c;人员在一…

看完这个,别说你还找不到免费好用的配音软件

有很多小伙伴还在找配音工具&#xff0c;今天就给大家一次性分享四款免费好用的配音工具&#xff0c;每一个都经过测试&#xff0c;并且是我们自己也在用的免费配音工具 第一款&#xff0c;悦音配音工具 拥有强悍的AI智能配音技术&#xff0c;更专业&#xff0c;完美贴近真人配…

soul协议算法

逆向工程技术是指对软件或应用程序进行逆向分析以了解其内部机制和功能的过程。虽然我无法详细介绍"Soul App"的逆向工程技术&#xff0c;但以下是一些常见的逆向工程技术&#xff0c;可能与你的研究相关&#xff1a; 1. 反汇编&#xff08;Disassembly&#xff09;…

获取Webshell方法

CMS系统指的是内容管理系统。已经有别人开发好了整个网站的前后端&#xff0c;使用者只需要部署cms&#xff0c;然后通过后台添加数据&#xff0c;修改图片等工作&#xff0c;就能搭建好一个的WEB系统。 CMS获取Webshell方法 WordPress后台拿Webshell phpcms拿Webshell 非CMS…

视觉霸主SAM和文图霸主CLIP强强联合!苹果联合UIUC,发布统一视觉模型SAM-CLIP,或掀起多模态新浪潮

作者 | ZenMoore 相信大家对 SAM[1] 并不陌生&#xff0c;它是 Meta 此前发布的 Segment Anything Model (分割一切模型)。一经发布便火遍全网震惊世界&#xff0c;史称“视觉领域的 ChatGPT 时刻”。 大模型研究测试传送门 GPT-4传送门&#xff08;免墙&#xff0c;可直接测…

springboot的spring.jackson.date-format失效解决

看起来数据库的格式非常完美,但是数据库字段look_date 是 datetime类型,java里没有datetime类型,这样一来如果你不在后端做处理,那么模型属性Date来接收一定会出问题.我通过实验证明最后拿到的是一个时间戳. 第一 解决时间格式问题 1.可以通过application.propertis配置文件中…

Element UI的table不同应用

目录 一、自定义表头 二、纵向表头(动态表头) 2.1、分别拿到表头和表头中日期对应的行数据 2.2、拿到每个日期对应的列数据 一、自定义表头 <el-table-column prop"chu" align"center"><!-- 自定义表头 --><template slot"header…

Java 实现灰度图转真彩图

目录 1 问题2 实现1 问题 Java 实现灰度图转真彩图 将以上的图片,jpg png 都可以,转为有颜色的 2 实现 import javax.imageio.ImageIO; import java.awt.*; import java.awt.image.BufferedImage; import java.awt.image.Raster; import java.io.File;public class DatUtil…

铜排载流量表新垂直拼接表-分享一张铜排的载流量表可以方便查看铜排重量计算

可以方便的铜排重量的铜排载流量表来了&#xff0c;方便查询和选择&#xff0c;希望能够帮到你&#xff1a; 下载&#xff1a;https://download.csdn.net/download/weixin_43097956/88490649

招投标系统简介 企业电子招投标采购系统源码之电子招投标系统 —降低企业采购成本

功能描述 1、门户管理&#xff1a;所有用户可在门户页面查看所有的公告信息及相关的通知信息。主要板块包含&#xff1a;招标公告、非招标公告、系统通知、政策法规。 2、立项管理&#xff1a;企业用户可对需要采购的项目进行立项申请&#xff0c;并提交审批&#xff0c;查看所…

Redis配置多个端口记录

一、背景&#xff1a; 使用Redis做WEB系统缓存&#xff0c;如登录信息、数据字典 等 键值对信息&#xff1b;存在多个测试环境及开发连接使用默认的6379端口&#xff0c;易造成Key重复&#xff0c;缓存紊乱&#xff0c;网络堵塞&#xff1b; 额外增开6380、6381端口&#xff0c…

【OpenCV实现平滑图像金字塔,轮廓:入门】

文章目录 概要图像金字塔轮廓&#xff1a;入门 概要 文章内容的概要&#xff1a; 平滑图像金字塔&#xff1a; 图像金字塔是什么&#xff1f; 图像金字塔是指将原始图像按照不同的分辨率进行多次缩小&#xff08;下采样&#xff09;得到的一系列图像。这种处理方式常用于图像…

Mojo::UserAgent模块做的一个快速爬虫项目

use Mojo::UserAgent;my $ua Mojo::UserAgent->new; my $proxy duoip:8000;# 使用爬虫IP $ua->proxy(http, $proxy) # 设置http爬虫IP->proxy(https, $proxy); # 设置https爬虫IPmy $res $ua->get(音乐网址); if ($res->is_success) {print $res->body; …

GIT文件夹上面的状态(对钩或红色感叹号)不显示,解决

换了新电脑&#xff0c;GIT代码上传啥的都正常&#xff0c;但是文件中文件图标状态不显示&#xff0c;搜了一下已找到解决方法&#xff0c;实测有效。 第一步 winr&#xff0c;输入regedit.exe&#xff0c;打开注册表 第二步 找到以下路径 “ HKEY_LOCAL_MACHINE–>SOFTWA…

JS 去除字符串中所有标点符号

直接上代码了 var str 这是《书》中的一段&#xff0c;两段文字。; var new_str str.replace(/[:_.~!#$%^&*() \ <>?"{}|, \/ ; \\ [ \] ~&#xff01;#&#xffe5;%……&*&#xff08;&#xff09;—— \ {}|《》&#xff1f;&#xff1a;“”【】、&a…

八、ACL访问控制列表实验

拓扑图&#xff1a; 通过某些特定的条件&#xff0c;端口号&#xff0c;ip地址&#xff0c;来限定某些数据包的访问 在这张拓扑图中&#xff0c;使得1.0和2.0能够访问服务器&#xff0c;但是两个网段不能互通 首先根据拓扑图把ip分配完毕&#xff0c; 高级acl命令可以用设置源…

js 在数组对象 过滤掉无用的数据

下面的数组中有null&#xff0c; undefind&#xff0c; NaN&#xff0c; ’ &#xff0c;过滤掉这些数据 let arr [12, null, 0, xyz, null, -25, NaN, , undefined, 0.5, false]; let arr1 [{k:12,o:1},{k:12,o:null},{k:12,o:NaN}, {k:null,o:}, {k:0,o:0}, {k:xyz,o:1}, …

亲测有效!盘点3款好用的录屏软件

随着社会的发展&#xff0c;视频内容的制作和共享变得比以往任何时候都更重要。无论是录制在线课程、游戏过程&#xff0c;还是制作教程或视频演示&#xff0c;一款好用的录屏软件都能让用户事半功倍。接下来&#xff0c;我们将介绍三款各自适用于不同场景的录屏软件&#xff0…

AWS SAP-C02教程11-解决方案

本章中,会根据一些常见场景的解决方案或者AWS的某一方面的总结,带你了解AWS各个组件之间的配合使用、如何在解决方案中选择组件以及如何避开其本身限制实现需求。 目录 1 处理高并发解决方案(Handing Extreme Rates)2 日志管理(AWS Managed Logs)3 部署解决方案(Deploy…

循环神经网络 - RNN

循环神经网络&#xff08;Rerrent Neural Network,RNN&#xff09;是神经网络的一种&#xff0c;类似的还有深度神经网络&#xff08;DNN&#xff09;、卷积神经网路(CNN)、生成对抗网络&#xff08;GAN)等。**RNN对具有时序特性的数据非常有成效&#xff0c;他能挖掘数据中的时…