二叉树链式结构的前序、中序、后序、层序遍历

文章目录

  • 一、二叉树创建
  • 二、前序遍历
    • 概念以及解释
    • 代码
  • 三、中序遍历
    • 概念及解释
    • 代码
  • 四、后序遍历
    • 概念及解释
    • 代码
  • 五、层序遍历
    • 概念及解释
    • 代码

一、二叉树创建

&mesp; 实现二叉树的遍历,我们要先手搓出一个二叉树,在次基础上实现二叉树的前序、中序、后序、层序遍历。


创建二叉树节点的结构体,包括该节点的值,以及该节点的左节点和右节点。

typedef int BTDataType;

typedef struct BinaryTreeNode
{
	BTDataType data;
	struct BinaryTreeNode* left;
	struct BinaryTreeNode* right;
}BTNode;

创建一个函数BinaryTreeCreate,在这个函数内手搓出一棵二叉树
//申请节点
BTNode* BuyNode(int x)
{
	BTNode* node = (BTNode*)malloc(sizeof(BTNode));
	if (node == NULL)
	{
		perror("malloc: BuyNode");
		return 0;
	}

	node->data = x;
	node->left = node->right = NULL;
}

//二叉树
BTNode* BinaryTreeCreate()
{
    //创建6个节点
	BTNode* node1 = BuyNode(1);
	BTNode* node2 = BuyNode(2);
	BTNode* node3 = BuyNode(3);
	BTNode* node4 = BuyNode(4);
	BTNode* node5 = BuyNode(5);
	BTNode* node6 = BuyNode(6);

	node1->left = node2;//1的左节点是2
	node1->right = node4;//1的右节点是4
	node2->left = node3;//2的左节点是3
	node4->left = node5;//4的左节点是5
	node4->right = node6;//4的右节点是6

	return node1;
}


下面是二叉树展示图
在这里插入图片描述
                      前序、中序、后序遍历均已递归方式来实现

二、前序遍历

概念以及解释

  前序遍历(Preorder Traversal 亦称先序遍历)——访问根结点的操作发生在遍历其左右子树之前。
  前序遍历打印顺序为:根、左、右
在这里插入图片描述

代码

// 二叉树前序遍历 (根  左  右)
void  BinaryTreePrevOrder(BTNode* root)
{
	if (root == NULL)
	{
		printf("N ");//为空就打印 N
		return 0;
	}
		
	printf("%d ", root->data);//先打印根节点
	BinaryTreePrevOrder(root->left); //递归遍历左子树
	BinaryTreePrevOrder(root->right);//递归遍历右子树
}

三、中序遍历

概念及解释

  中序遍历(Inorder Traversal)——访问根结点的操作发生在遍历其左右子树之中(间)。
  中序遍历打印顺序为:左、根、右
在这里插入图片描述

代码

void BinaryTreeInOrder(BTNode* root)
{
	if (root == NULL)
	{
		printf("N ");
		return 0;
	}
	BinaryTreeInOrder(root->left);//递归遍历左子树
	printf("%d ", root->data);//打印根节点
	BinaryTreeInOrder(root->right);//递归遍历右子树
}

四、后序遍历

概念及解释

&rmsp;&emsp**;后序遍历**(Postorder Traversal)——访问根结点的操作发生在遍历其左右子树之后。
  后序遍历的顺序为左、右、根
在这里插入图片描述

代码

// 二叉树后序遍历
void BinaryTreePostOrder(BTNode* root)
{
	if (root == NULL)
	{
		printf("N ");
		return 0;
	}
	BinaryTreePostOrder(root->left);
	BinaryTreePostOrder(root->right);
	printf("%d ", root->data);
}

五、层序遍历

概念及解释

  层序遍历:除了先序遍历、中序遍历、后序遍历外,还可以对二叉树进行层序遍历。设二叉树的根结点所在层数为1,层序遍历就是从所在二叉树的根结点出发,首先访问第一层的树根结点,然后从左到右访问第2层上的结点,接着是第三层的结点,以此类推,自上而下,自左至右逐层访问树的结点的过程就是层序遍历。


  层序遍历在图形上比前面三种遍历要清晰明了的多,但是在实现上就比较复杂了。他的实现需要用到队列的实现,队列的相关代码在前的博客中已经详细的介绍过了,所以这里我们直接运用。
队列的实现代码:队列的实现
在这里插入图片描述
在这里插入图片描述

代码

// 层序遍历
void BinaryTreeLevelOrder(BTNode* root)
{
	Queue q;
	QueueInit(&q);//初始化链表
	if (root != NULL)
	{
		QueuePush(&q, root);//插入链表
	}

	while (!QueueEmpty(&q))
	{
		BTNode* top = QueueFront(&q);//取头节点
		QueuePop(&q);//头节点出队列
		printf("%d ", top->data);

		if (top->left)
		{
			QueuePush(&q, top->left);//插入队列
		}
		if (top->right)
		{
			QueuePush(&q, top->right);//插入队列
		}
	}
	printf("\n");
	QueueDestory(&q);
	
}

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

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

相关文章

清洁力强的洗地机前十名排行榜:2024十大洗地机热销款式好用不踩雷

如今,洗地机行业竞争激烈,各品牌紧紧抓住用户对智能化和深度清洁的需求,深入研究创新。经过几轮行业内部的激烈竞争后,许多厂商在宣传中各说各的,对洗地机的重要参数描述不一,给消费者的选择带来了不少困惑…

深度学习-02-创建变量的函数

深度学习-02-创建变量的函数 本文是《深度学习入门2-自製框架》 的学习笔记,记录自己学习心得,以及对重点知识的理解。如果内容对你有帮助,请支持正版,去购买正版书籍,支持正版书籍不仅是尊重作者的辛勤劳动&#xff0…

手机离线翻译哪个好?断网翻译也能超丝滑

有时在异国他乡,面对语言不通的窘境,即便是简单的对话也变得异常困难,真是挑战满满! 然而,能离线翻译的软件让语言障碍不再是问题,不必依赖网络也能轻松进行翻译啦~ 只需下载所需的语言包,选择…

牛客ONT45 距离是K的二叉树节点【中等 宽度优先遍历 Java/Go/PHP/C++】

题目 题目链接: https://www.nowcoder.com/practice/e280b9b5aabd42c9b36831e522485622 思路 图,队列 构件图,直接从target出发,扩展到第k层就是答案Java代码 import java.util.*;/** public class TreeNode {* int val 0;* …

Anthropic公司CEO谈AI发展:Cluade安全超过商业利益

Anthropic公司今年3月发布的超越GPT-4模型Claude3 opus,成功吸引了大量GPT-4用户“叛变”。 作为OpenAI的头号劲敌,Claude3发布方Anthropic公司的联合创始人兼CEO,达里奥阿莫迪(DarioAmodei)承诺:在能够制…

激光焊接机作为一种高效、精密的焊接设备

激光焊接机是一种用于材料加工时激光焊接的机器,以下是对其的详细介绍: 1. 定义与别称: 激光焊接机,又常称为激光焊机、镭射焊机,是材料加工激光焊接时用的机器。 2. 工作原理: 激光焊接是利用高能量…

【贪心算法题目练习】

1. 分发饼干 这道题目和我们之前讲到的田忌赛马的问题很相似,只不过这这里不需要劣等马去抵消掉优等马,直接上贪心策略: 先将两个数组排序。针对胃口较小的孩子,从小到大挑选饼干: i. 如果当前饼干能满足,直接喂(最小…

【CPP】栈简介及简化模拟实现

CPP栈和队列简单模拟实现 目录 1. 栈的简介2. 栈简化模拟实现3. 栈练习题 1. 栈的简介 栈 是一种 特殊的线性表,具有数据 先进后出 特点。 具体参考:【数据结构】栈 CPP库参考文档:stl_stack 注意: 1.stack本身 不支持迭代器操…

C++之构造函数总结

1、构造函数定义 在C中,构造函数是一种特殊的成员函数,它在创建一个类的对象时自动被调用。构造函数的主要目的是初始化类对象的成员变量,为对象分配资源,以及执行任何其他必要的初始化任务。 构造函数具有以下特点: …

WinApp自动化测试之辅助工具介绍

前篇文章中,我们简单介绍了部分WinApp自动化测试脚本常规操作,今天我们来讲剩余的部分。 文件批量上传 文件批量上传和文件单个上传原理是相同的,单个上传直接传入文件路径即可,批量上传需要进入批量上传的文件所在目录&#xf…

python-双胞胎字符串

[问题描述]:给定两个字符串s和t,每次可以任意交换s的奇数位和偶数位的字符,即奇数位的字符可以与任意其它奇数位的字符交换,偶数位的字符同样也可以与任意偶数位的字符的字符交换,问能否在有限的次数的交换下使s变为t?…

0基础学习Elasticsearch-Quick start

文章目录 1 背景2 前言3 快速部署ES4 快速部署Kibana5 发送请求给ES5.1 打开Kibana控制台5.2 通过REST API发送请求5.3 通过curl发送请求5.4 添加数据5.4.1 添加单个document5.4.2 添加多个document 5.5 搜索数据5.5.1 搜索所有documents5.5.2 match查询 6 总结 1 背景 因电商项…

【算法】模拟算法——外观数组(medium)

题解:模拟算法——外观数组(medium) 目录 1.题目2.题解3.参考代码4.总结 1.题目 题目链接:LINK 2.题解 首先应该理解题意: 就是开始给你一个字符串,然后你对其进行描述。 描述规则是:连续的数字为一组,…

大学生社团活动平台系统基于springboot+vue的社团管理系统java项目sprignboot项目

文章目录 大学生社团活动平台一、项目介绍二、部分功能截图三、部分代码展示四、底部获取项目源码(9.9¥带走) 大学生社团活动平台 一、项目介绍 基于springbootvue的前后端分离大学生社团活动平台 系统角色 : 学生、社长、管理员 1、学生…

自学 Java 怎么入门?

关于自学 Java 如何入门这一重要课题,在此为大家进行详细阐述。 在此之前,如果大家有兴趣的话,可以看看我自己精心整理的嵌入式入门资料,这些资料将全部免费送给大家。其中包含了编程教学内容、详细的视频讲解、实用的数据库资料…

Java项目:92 基于SSM的办公管理系统

作者主页:舒克日记 简介:Java领域优质创作者、Java项目、学习资料、技术互助 文中获取源码 基于SSM的办公管理系统 1、项目介绍 基于SSM的办公管理系统主要是对于办公用品的申领进行管理,系统分为三种角色,超级管理员、企业 职…

自然语言处理基础知识入门(六) GPT模型详解

GPT 前言一、GPT模型1.1 为什么采用Decoder模块?1.2 为什么不使用Encoder模块? 二、 模型训练2.1 预训练阶段2.2 半监督微调 总结 前言 在之前的章节中,深入探究了预训练ELMo模型的架构与实现原理。通过采用双向LSTM架构在大规模文本数据上进…

C++匿名对象

struct:结构体内默认访问权限:public公共->哪里都能用 class:结构体内默认访问权限:private私有->只能在类里使用 简单版本: class SV { public:SV(int dt 520):_data1(dt){};int R_num(){return _data1;}priv…

易语言本地IP一键切换程序(附带源码)

易语言本地IP一键切换程序 效果图部分源码源码领取下期更新预报 效果图 部分源码 .判断开始 (单选框1.选中 = 真)标签5.标题 = #换行符 + “正在切换IP.”.如果真 (运行 (“netsh interface ip set address ” + #引号 &#xff…

yxc图示“链式前向星”核心操作

【知识点:链式前向星】 ● 大佬 yxc 指出“链式前向星”就是“多单链表”,并基于“头插法”给出了所涉及到的 e[]、ne[]、h[] 等数组的独特解释,更易理解。其中:h[a]:存储单链表表头结点 a 的编号e[idx]:存…