《二叉树》——1

目录

前言:

二叉树的链式结构

二叉树的遍历

前序遍历:

中序遍历:

后序遍历:

总结:


前言:

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

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

二叉树的链式结构

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


 

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

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

相关文章

GoLang基础

1 与其他语言相比,使用go有什么好处? 简洁易学:相比其他编程语言,Go语言具有清晰简洁的语法和规范,减少了代码的复杂性。Go语言拥有较少的关键字和一致的格式,使得代码易于编写、阅读和维护。新手可以很快…

MyBatis 的XML实现方法(JAVA)

数据库表的结构如下: DROP DATABASE IF EXISTS test; CREATE DATABASE test DEFAULT CHARACTER SET utf8mb4; -- 使⽤数据数据 USE test; -- 创建表[⽤⼾表] DROP TABLE IF EXISTS userinfo; CREATE TABLE userinfo ( id INT ( 11 ) NOT NULL AUTO_INCREMENT, user…

Vue+ElementUI渲染select下拉框

User.java /*实现getter和setter方法注解*/ Data public class User {private Integer id;private String name; } UserMapper.java Mapper public interface CommonUserMapper {/**查询所有*/List<CommonUser> selectAllCommonUser(); } UserMapper.xml <?xml …

压力容器多开孔结构静力分析APP

压力容器多开孔结构静力分析APP对带有多个接管的容器结构在内压作用下进行静力分析&#xff0c;考察相邻接管开孔对容器及接管强度的影响。通过对容器和接管的几何尺寸、材料属性、载荷等进行参数化&#xff0c;以方便设计工程师对不同参数下的此类结构进行仿真分析。 近年来&a…

常用设计模式(工厂方法,抽象工厂,责任链,装饰器模式)

前言 有关设计模式的其他常用模式请参考 单例模式的实现 常见的设计模式(模板与方法&#xff0c;观察者模式&#xff0c;策略模式) 工程方法 定义 定义一个用于创建对象的接口&#xff0c;让子类决定实例化哪一个类。Factory Method使得一个类的实例化延迟到子类。 ——《设…

【idea】idea中编译内存不足(java: java.lang.0ut0fMemoryError: Java heap space)的解决方法

问题 在编译一个较大的idea项目时候&#xff0c;有时候会显示内存不足&#xff0c;导致项目编译失败 原因 编译项目时实际也是启动了jvm进行的&#xff0c;所以需要分配对应的内存大小。 这个大小在idea中有一个默认的配置&#xff0c;大小是700M。 对于一个大型的项目这个大…

数学建模--PageRank算法的Python实现

文章目录 1. P a g e R a n k PageRank PageRank算法背景2. P a g e R a n k PageRank PageRank算法基础2.1. P a g e R a n k PageRank PageRank问题描述2.2.有向图模型2.3.随机游走模型 3. P a g e R a n k PageRank PageRank算法定义3.1. P a g e R a n k PageRank PageRank…

qml 简单变换

有3个圣诞树&#xff1a; 点击第1个圣诞树&#xff0c;每点击一次&#xff0c;向右平移10px&#xff1b; 点击第2个圣诞树&#xff0c;每点击一次&#xff0c;旋转角度增加20度&#xff1b; 点击第3个圣诞树&#xff0c;每点击一次&#xff0c;旋转角度增加20度&#xff0c;…

电脑如何pdf转图片?pdf转图片工具介绍

无论是为了共享、展示、编辑、安全保护、印刷出版、学术研究还是教育目的&#xff0c;使用电脑pdf转图片都是一种非常实用的工具和技术&#xff0c;它提供了更多的灵活性、可视化效果和安全性&#xff0c;适用于各种日常使用场景&#xff0c;那么有没有好用的pdf转图片工具推荐…

《GitHub Copilot 操作指南》课程介绍

第1节&#xff1a;GitHub Copilot 概述 一、什么是 GitHub Copilot 什么是 GitHub Copilot GitHub Copilot是GitHub与OpenAI合作开发的编程助手工具&#xff0c;利用机器学习模型生成代码建议。它集成在开发者的集成开发环境&#xff08;IDE&#xff09;中&#xff0c;可以根…

国产品牌GC6609与TM2209的参数分析,为什么适用于3D打印机,医疗器械等产品中

步进电机驱动的应用方案目前市场上大多选用国外品牌的电机驱动器&#xff0c;其中trinamic的TMC2208/2209在这一块的应用很广泛。但是由于市场越来越应激。&#xff0c;当前对于产品开发成本要求也越来越低&#xff0c;国产品地准出了相应的TMC2208/2209&#xff0c;因此trinam…

linux zabbix监控

zabbix总结 zabbix-server 10051 zabbix-agent 10050 zabbix-proxy 10051 1.监控项&#xff08;模板&#xff09;&#xff1a;获取监控数据 #模板直接链接到新的主机 2.触发器&#xff1a;设置一个值 在非合理区间报警 3.动作&#xff1a;可以帮忙发送通知&#xff08;告…

SpringBoot之文件上传

1、文件上传原理&#x1f618; 表单的enctype 属性规定在发送到服务器之前应该如何对表单数据进行编码。 当表单的enctype"application/x-www-form-urlencoded"&#xff08;默认&#xff09;时&#xff0c;form表单中的数据格式为&#xff1a;keyvalue&keyvalue …

中国电子学会2023年09月份青少年软件编程Scratch图形化等级考试试卷一级真题(含答案)

一、选择题&#xff08;共25题&#xff0c;每题2分&#xff09; 1.下列哪项内容是不可以修改的&#xff1f;&#xff08;2分&#xff09; A.角色名称 B.造型名称 C.舞台名称 D.背景名称 答案解析&#xff1a;舞台的名称无法修改&#xff0c;可以修改舞台中某一个背景的名…

ChatGPT:关于 OpenAI 的 GPT-4工具,你需要知道的一切

ChatGPT&#xff1a;关于 OpenAI 的 GPT-4工具&#xff0c;你需要知道的一切 什么是GPT-3、GPT-4 和 ChatGPT&#xff1f;ChatGPT 可以做什么&#xff1f;ChatGPT-4 可以做什么&#xff1f;ChatGPT 的费用是多少&#xff1f;GPT-4 与 GPT-3.5 有何不同&#xff1f;ChatGPT 如何…

【C语言进阶】编译和链接

引言 介绍编译和链接相关知识&#xff0c;计算机如何识别我们的代码&#xff0c;如何将我们的代码转化为计算机可执行程序。 ✨ 猪巴戒&#xff1a;个人主页✨ 所属专栏&#xff1a;《C语言进阶》 &#x1f388;跟着猪巴戒&#xff0c;一起学习C语言&#x1f388; 目录 翻译…

《WebKit 技术内幕》之七(2): 渲染基础

2 网页层次和RenderLayer树 2.1 层次和RenderLayer对象 前面章节介绍了网页的层次结构&#xff0c;也就是说网页是可以分层的&#xff0c;这有两点原因&#xff0c;一是为了方便网页开发者开发网页并设置网页的层次&#xff0c;二是为了WebKit处理上的便利&#xff0c;也就是…

使用 Vector 在 Kubernetes 中收集日志

多年来&#xff0c;我们一直在使用 Vector 在我们的 Kubernetes 平台中收集日志&#xff0c;并成功地将其应用于生产中以满足各种客户的需求&#xff0c;并且非常享受这种体验。因此&#xff0c;我想与更大的社区分享它&#xff0c;以便更多的 K8s 运营商可以看到潜力并考虑他们…

[足式机器人]Part2 Dr. CAN学习笔记- 最优控制Optimal Control Ch07-1最优控制问题与性能指标

本文仅供学习使用 本文参考&#xff1a; B站&#xff1a;DR_CAN Dr. CAN学习笔记 - 最优控制Optimal Control Ch07-1最优控制问题与性能指标

亚马逊KYC审核的重要性,所需提交的文件有哪些?—站斧浏览器

亚马逊KYC审核的重要性有哪些&#xff1f; KYC审核是亚马逊对卖家身份的一种验证&#xff0c;确保卖家遵守相关法规。只有通过审核的卖家才能在欧洲平台进行销售。因此&#xff0c;正确理解和应对KYC审核对于卖家来说至关重要。 注册完成后立即触发&#xff1a;新注册的卖家可…