《二叉树》——1

news2024/12/23 14:42:55

目录

前言:

二叉树的链式结构

二叉树的遍历

前序遍历:

中序遍历:

后序遍历:

总结:


前言:

从本文开始,将进一步深入学习编程语言思想,从二叉树开始我们将接触许许多多的递归算法以及思想,我们应当重思想而再看代码,切记不可颠倒。相信大家在之后的学习或多或少会遇到些许困难,那么在刚开始学习递归算法时,我们需要勤动手,多画画图来帮助我们更好的理解递归。

接下来我们先来简单了解下二叉树的链式结构

二叉树的链式结构

typedef int BTDataType;
typedef struct BinaryTreeNode
{
	struct BinaryTreeNode* left;
	struct BinaryTreeNode* right;
	BTDataType data;
}TreeNode;
TreeNode* BuyTreeNode(int x)
{
	TreeNode* root = (TreeNode*)malloc(sizeof(TreeNode));
	if (root == NULL)
	{
		perror("BuyTreeNode -> malloc");
		exit(-1);
	}
	root->data = x;
	root->right = root->left = NULL;
	return root;
}

TreeNode* CreateTree()
{
	TreeNode* a = BuyTreeNode(1);
	TreeNode* b = BuyTreeNode(2);
	TreeNode* c = BuyTreeNode(3);
	TreeNode* d = BuyTreeNode(4);
	TreeNode* e = BuyTreeNode(5);
	TreeNode* f = BuyTreeNode(6);
	a->left = b;
	a->right = d;

	b->left = c;
	
	d->left = e;
	d->right = f;
	return a;
}

注意:上述代码并不是创建二叉树的方式,真正创建二叉树方式后序详解重点讲解。

通过上述的代码,不难得出,这颗新创建的二叉树如图:

通过之前的回顾,我们知道二叉树是:

1、空树

2、非空:根节点,根节点的左子树、根节点的右子树组成的。

从概念中可以看出,二叉树定义是递归式的,因此后序基本操作中基本都是按照该概念实现的。

二叉树的遍历

学习二叉树结构,最简单的方式就是遍历。所谓二叉树遍历(Traversal)是按照某种特定的规则,依次对二叉树中的节点进行相应的操作,并且每个节点只操作一次。访问结点所做的操作依赖于具体的应用问题。 遍历是二叉树上最重要的运算之一,也是二叉树上进行其它运算的基础。

按照规则,二叉树的遍历有前序/中序/后序的递归结构遍历
1. 前序遍历(Preorder Traversal 亦称先序遍历)——访问根结点的操作发生在遍历其左右子树之前。
2. 中序遍历(Inorder Traversal)——访问根结点的操作发生在遍历其左右子树之中(间)。
3. 后序遍历(Postorder Traversal)——访问根结点的操作发生在遍历其左右子树之后。

由于被访问的结点必是某子树的根,所以N(Node)L(Left subtree)R(Right subtree)又可解释为根、根的左子树和根的右子树。NLR、LNR和LRN分别又称为先根遍历、中根遍历和后根遍历。
 

前序遍历:

void PrevOrder(TreeNode* root)//前序排序
{
	if (root == NULL)
	{
		printf("N ");
	}
	else
	{
		printf("%d ", root->data);
		PrevOrder(root->left);
		PrevOrder(root->right);
	}
}

前序遍历简单的来说,就是先访问根节点,再访问左节点,最后访问右节点。

我们可以简化为(根、左、右)

那么通过以下的图片就能较好的解释这一遍历。

中序遍历:

那么对于中序遍历,就是遵从(左、根、右)

void InOrder(TreeNode* root)//中序遍历
{
	if (root == NULL)
	{
		printf("N ");
	}
	else
	{
		InOrder(root->left);
		printf("%d ", root->data);
		InOrder(root->right);
	}
}

后序遍历:

那么对于后序遍历,就是遵从(左、右、根)

void AfterOrder(TreeNode* root)//后序排序
{
	if (root == NULL)
	{
		printf("N ");
	}
	else
	{
		AfterOrder(root->left);
		AfterOrder(root->right);
		printf("%d ", root->data);
	}
}

总结:

先序遍历:1 2 3 N N N 4 5 N N 6 N N


中序遍历:N 3 N 2 N 1 N 5 N 4 N 6 N


后序遍历:N N 3 N 2 N N 5 N N 6 4 1


 

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

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

相关文章

力扣hot100 合并两个有序链表 递归 双指针

Problem: 21. 合并两个有序链表 文章目录 💖 递归思路 💖 双指针 💖 递归 思路 👨‍🏫 参考地址 n , m n,m n,m 分别为 list1 和 list2 的元素个数 ⏰ 时间复杂度: O ( n m ) O(nm) O(nm) 🌎 空间复杂…

力扣62. 不同路径

动态规划 思路: 定义 dp[r][c] 为到达坐标 (r, c) 的路径数: 它只能有同一行左边相邻方格向右到达或者同一列上方相邻方格向下到达;状态转移方程: dp[r][c] dp[r][c - 1] dp[r - 1][c]初始状态 dp[0][0] 1第一行的路径数是 1第…

恒创科技:云服务器配置中的vCPU与物理CPU有啥区别?

​  说到云服务器,您可能经常会遇到vCPU这个词,而且它和物理CPU经常被拿来谈论。尽管它们听起来相似,但两者之间存在显著差异。在本文中,我们将详细讨论云vCPU和物理CPU之间的差异。 物理与虚拟 CPU 和 vCPU 之间最显著的区别在…

【Linux】-对于信号章节补充的知识点,以及多线程知识的汇总

💖作者:小树苗渴望变成参天大树🎈 🎉作者宣言:认真写好每一篇博客💤 🎊作者gitee:gitee✨ 💞作者专栏:C语言,数据结构初阶,Linux,C 动态规划算法🎄 如 果 你 …

非线性最小二乘问题的数值方法 —— 狗腿法 Powell‘s Dog Leg Method (II, Python 简单实例)

Title: 非线性最小二乘问题的数值方法 —— 狗腿法 Powell‘s Dog Leg Method (II, Python 简单实例) 姊妹博文 非线性最小二乘问题的数值方法 —— 狗腿法 Powell‘s Dog Leg Method (I - 原理与算法) 0.前言 本篇博文作为对前述 “非线性最小二乘问题的数值方法 —— 狗腿法…

L1-069 胎压监测(Java)

小轿车中有一个系统随时监测四个车轮的胎压,如果四轮胎压不是很平衡,则可能对行车造成严重的影响。 让我们把四个车轮 —— 左前轮、右前轮、右后轮、左后轮 —— 顺次编号为 1、2、3、4。本题就请你编写一个监测程序,随时监测四轮的胎压&…

系统架构14 - 软件工程(2)

需求工程 需求工程软件需求两大过程三个层次业务需求(business requirement)用户需求(user requirement)功能需求 (functional requirement)非功能需求 概述活动阶段需求获取基本步骤获取方法 需求分析三大模型数据流图数据字典DD需求定义方法 需求验证需求管理需求基线变更控制…

Hylicos - MINI2440 - 中断控制

中断 中断源管理 中断是一种异步异常,CPU需要处理很多来自设备的中断请求,而CPU引出的line只有IRQ线和FIQ线,所以就得引入中断控制器帮助CPU搞清楚是中断的来源。 MINI2440的中断控制器,可以接受来自60个中断源的请求。提供这些…

Redis双写一致性

所有的情况都是再并发情况下存在温蒂 一、先更新数据库,再更新缓存场景-不推荐 当有两个线程A、B,同时对一条数据进行操作,一开始数据库和redis的数据都为1,当线程A去修改数据库,将1改为2,然后线程A在修改…

幻兽帕鲁专用服务器

随着幻兽帕鲁这款游戏的热度持续升温,我们遍寻全网,带给各位玩家一个全新的、高品质的游戏体验——莱卡云服务器。有幻兽帕鲁的热衷者们无需再为了服务器的选取困扰,因为我们可以肯定地说:选择莱卡云,你不会失望。 首先…

数据库复试—关系数据库标准语言SQL

数据库复试—关系数据库标准语言SQL SQL:结构化查询语言 以教材中的学生-课程数据库为例进行SQL基础语法的复习 数据库实验环境选择SQLServer 11 关系模式 学生表Student(Sno,Sname,Ssex,Sage,Sdept) 课程表Course(Cno,Cname,Cpno,Ccredit) 学生选课表SC&#xf…

Linux操作系统——理解软硬链接

1.引言 通过我们前面理解文件系统的基础上,我们来理解软硬链接,在我们学习文件的时候我们会见到各种链接文件,其中链接文件分为两种,一种叫软连接,一种叫硬链接。 下面我们新建一个log文件,要对log这个文…

搭建一个简单的Spring Demo

要学习Spring 源码,一个是从Spring GitHub 上去down源码,然后倒入IDEA编译,但这种方法费时费力,如果你不需要对Spring 源码进行修改后,再编译的话,直接搭建一个Spring Demo 的Maven项目,引入Spr…

Linux操作系统——理解文件系统

预备知识 到目前为止,我们所学习到的关于文件的操作,全部都是基于文件被打开,被访问,访问期间比较重要的有重定向,缓冲区,一切皆文件,当我们访问完毕的时候需要将文件关闭,关闭时那…

关于事务的最常见的十道面试题

面试题一:什么是事务?为什么需要事务? 事务(Transaction)是保证数据库可靠性和稳定性的一种机制,单个逻辑工作单元执行的一系列操作,这些操作要么全部完成,要么全部不完成,是数据库环境中的最小…

Aria2 WebUI控制台 任意文件读取漏洞复现(CVE-2023-39141)

0x01 产品简介 Aria2 WebUI控制台是用于下载文件的实用程序。它支持 HTTP(S)/FTP/SFTP/BitTorrent 和 Metalink 协议。aria2可以从多个来源/协议下载文件,并尝试利用您的最大下载带宽。它支持同时从HTTP(S)/FTP/SFTP和BitTorrent下载文件,而从HTTP(S)/FTP/SFTP下载的数据上…

《WebKit 技术内幕》学习之八(1):硬件加速机制

《WebKit 技术内幕》之八(1):硬件加速机制 1 硬件加速基础 1.1 概念 这里说的硬件加速技术是指使用GPU的硬件能力来帮助渲染网页,因为GPU的作用主要是用来绘制3D图形并且性能特别好,这是它的专长所在,它…

深入了解WPF控件:常用属性与用法(六)

掌握WPF控件:熟练常用属性(六) ListView 用于展示数据项集合的列表控件。它提供了丰富的功能和灵活的定制性,可以轻松地展示和编辑大量的数据。 常用属性描述ItemsSource用于设置ListView的数据源。可以是一个集合、数组或列表…

架构师考试相关信息

文章目录 去年考试安排官网通知: 中国计算机技术职业资格网(今年的安排估计2月份放出,结果大约12月) 1.系统架构的考试要求: (1)掌握计算机硬软件与网络的基础知识; &…