二叉树遍历及应用

news2024/12/23 1:33:38

在这里插入图片描述

文章目录

  • 前言
  • 构建二叉树
  • 前序遍历
  • 中序遍历
  • 后序遍历
  • 二叉树的结点个数
  • 二叉树的叶节点个数
  • 二叉树的高度
  • 二叉树第K层结点个数

前言

二叉树的遍历及应用主要是运用了递归、分治的思想。在这一篇文章,小编将介绍二叉树的前序遍历、中序遍历、后序遍历,求二叉树结点个数、叶节点个数、第K层结点个数、二叉树的深度。

构建二叉树

手搓二叉树的结构

小编简单构建一个二叉树的结构,方便后面的测试

构建的方式比较简单,在树的结构中有当前结点的数据、当前结点的左节点、右节点。除此之外,还需要开辟结点。

有了 前面数据结构的学习,小编认为手搓一个二叉树的结构相对来说简单一些

typedef int Tdatatype;

typedef struct Tree
{
	Tdatatype data;
	struct Tree* left;
	struct Tree* right;
}Tree;

Tree* BuyTree(Tdatatype x)
{
	Tree* node = (Tree*)malloc(sizeof(Tree));
	if (node == NULL)
	{
		perror("malloc fail");
		return NULL;
	}
	node->data = x;
	node->left = NULL;
	node->right = NULL;

	return node;
}

Tree* CreatTree()
{
	Tree* node1 = BuyTree(1);
	Tree* node2 = BuyTree(2);
	Tree* node3 = BuyTree(3);
	Tree* node4 = BuyTree(4);
	Tree* node5 = BuyTree(5);
	Tree* node6 = BuyTree(6);
	Tree* node7 = BuyTree(7);
	node1->left = node2;
	node1->right = node4;
	node2->left = node3;
	node2->right = node7;
	node4->left = node5;
	node4->right = node6;

	return node1;
}

前序遍历

若二叉树为空,则操作为空
否则:
(1)访问根节点
(2)先序遍历左子树
(3)先序遍历右子树

void PrevOrder(Tree* root)
{
	if (root == NULL)
	{
		printf("N ");
		return;
	}
	PrevOrder(root->left);
	printf("%d ", root->data);
	PrevOrder(root->right);
}

中序遍历

若二叉树为空,则操作为空
否则:
(1)中序遍历左子树
(2)访问根节点
(3)中序遍历右子树

void InOrder(Tree* root)
{
	if (root == NULL)
	{
		printf("N ");
		return;
	}

	InOrder(root->left);
	printf("%d ", root->data);
	InOrder(root->right);
}

后序遍历

若二叉树为空,则操作为空
否则:
(1)后序遍历左子树
(2)后序遍历右子树
(3)访问根节点

void PostOrder(Tree* root)
{
	if (root == NULL)
	{
		printf("N ");
		return;
	}
	PostOrder(root->left);
	PostOrder(root->right);
	printf("%d ", root->data);
}

二叉树的结点个数

求二叉树的结点个数还是用到递归的思想,即子问题分治,还需要有结束条件

子问题分治:左子树结点个数+右子树结点个数+1
返回条件:根节点为空

int TreeSize(Tree* root)
{
	return root == NULL ? 0 : TreeSize(root->right) + TreeSize(root->right) + 1;
}

二叉树的叶节点个数

求二叉树叶节点个数依然是递归思想

子问题分治:左子树叶子节点个数+右子树叶子节点个数
返回条件:根节点为空,,返回0;是叶子节点,返回1

int TreeLeaSize(Tree* root)
{
	if (root == NULL)
		return 0;
	if (root->left == NULL && root->right == NULL)
		return 1;
	return TreeLeaSize(root->left) + TreeLeaSize(root->right);
}

二叉树的高度

子问题分治:找左子树和右子树中高度较大的那一个,并+1
返回条件:根节点为空,返回0

int TreeHight(Tree* root)
{
	if (root == NULL)
		return 0;
	int left = TreeHight(root->left);
	int right = TreeHight(root->right);
	return left > right ? left + 1 : right + 1;
}

二叉树第K层结点个数

二叉树第k层的节点数=左子树的第k-1层的节点数+右子树第k-1层的节点数。

因为二叉树没有第0层,是从第一层开始的,所以k==1时,返回1。

int TreeLevelK(Tree* root, int k)
{
	assert(k > 0);
	if (root == NULL)
		return 0;

	if (k == 1)
		return 1;

	return TreeLevelK(root->left, k - 1)
		+ TreeLevelK(root->right, k - 1);
}

在这里插入图片描述

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

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

相关文章

微软Copilot魔法来袭!用自然语言,点燃你的工作热情

近日我们发布了全新Copilot功能,旨在通过智能化的工作方式,提高企业整体的生产力和客户体验。新一代的Copilot结合了先进的AI技术,通过自然语言交互,为用户提供即时、个性化的信息和解决方案。这一变革性的工具将为现场服务人员提…

IDEA2023安装教程(超详细)

文章目录 前言安装IntelliJ IDEA1. 下载IntelliJ IDEA2. 运行安装程序3. 选择安装路径4. 选择启动器设置5. 等待安装完成6. 启动IntelliJ IDEA7. 配置和设置8. 激活或选择许可证9. 开始使用 总结 前言 随着软件开发的不断发展,IntelliJ IDEA成为了许多开发人员首选…

微软推出免费网站统计分析工具 Clarity

给大家推送一个福利,最近微软正式对外推出免费网站统计分析工具 Clarity,官方网站是:https://clarity.microsoft.com. 任何用户都可以直接使用,主打一个轻松写意——真的是傻瓜式,没有任何多余的步骤,你唯一…

Vivado版本控制

Vivado版本控制 如果您有幸进入FPGA领域,那么会遇到版本控制问题,本文讲解的是如何用git进行Vivado进行版本控制。 搭建Git环境 一 首先需要一个git环境,并选择一个托管平台(github,gitlab,gitee) Git下载地址&…

C++ string类—初始化、容量操作、迭代器

目录 前言 一、string类 二、初始化 1、无参或带参 2、用字符串变量初始化 3、用字符串初始化 4、指定数量字符 三、容量操作 1、size 2、push_back 3、append​编辑 4、运算符 5、reserve 6、resize 四、迭代器 五、OJ练习 反转字符 找出字符串中出现一次的…

什么是中间人攻击

中间人攻击 1. 定义2. 中间人攻击如何工作3. 常见中间人攻击类型4. 如何防止中间人攻击 1. 定义 中间人攻击(Man-in-the-Middle Attack,简称MITM),是一种会话劫持攻击。攻击者作为中间人,劫持通信双方会话并操纵通信过…

无脑018——win11部署whisper,语音转文字

1.conda创建环境 conda create -n whisper python3.9 conda activate whisper安装pytorch pip install torch1.8.1cu101 torchvision0.9.1cu101 torchaudio0.8.1 -f https://download.pytorch.org/whl/torch_stable.html安装whisper pip install -U openai-whisper2.准备模型…

密码学概论之基本概念

本人信息安全专业,大三,为着将来考研做准备,打算按照自己目前的理解给大家唠唠密码学。 这个专栏我将从以下七个章节来聊聊密码学,若有不当之处,敬请指出。 • 密码学概论 • 流密码 • 分组密码 • 公钥密码 •…

【数值计算方法(黄明游)】矩阵特征值与特征向量的计算(五):Householder方法【理论到程序】

文章目录 一、Jacobi 旋转法二、Jacobi 过关法三、Householder 方法1. 旋转变换a. 旋转变换的选择b. 旋转变换的顺序 2. Householder矩阵(Householder Matrix)a. H矩阵的定义b. H变换的几何解释c. H变换的应用场景 3. H变换过程详解a. 过程介绍b. 细节解…

vcomp140.dll是什么意思?vcomp140.dll缺失怎么修复的五个方法

在电脑使用过程中,我们常常会遇到一些错误提示,其中之一就是“由于找不到vcomp140.dll无法继续执行代码”。这个错误提示通常出现在运行某些程序时,给使用者带来了很大的困扰。那么,为什么会出现这个错误呢?又该如何解…

函数指针和指针函数的讲解

文章目录 指针函数函数指针函数指针的定义与指针函数的声明的区别函数指针的定义指针函数的声明 typedef在函数指针方面的使用typedef和using 给函数指针的类型取别名typedef和using 给函数的类型取别名 指针函数 指针函数: 也叫指针型函数,本质上就是一…

线上CPU飙高问题排查!

https://v.douyin.com/iRTqH5ug/ linux top命令 top 命令是 Linux 下一个强大的实用程序,提供了系统资源使用情况的动态、实时概览。它显示了当前正在运行的进程信息,以及有关系统性能和资源利用情况的信息。 以下是 top 命令提供的关键信息的简要概述…

整体迁移SVN仓库到新的windows服务器

一、背景 公司原有的SVN服务器年代比较久远经常出现重启情况,需要把SVN仓库重新迁移到新的服务器上,在网上也搜到过拷贝Repositories文件直接在新服务器覆盖的迁移方案,但考虑到原有的操作系统和现有的操作系统版本不一致,SVN版本…

【开源】基于JAVA的超市账单管理系统

项目编号: S 032 ,文末获取源码。 \color{red}{项目编号:S032,文末获取源码。} 项目编号:S032,文末获取源码。 目录 一、摘要1.1 项目介绍1.2 项目录屏 二、功能模块三、系统设计3.1 总体设计3.2 前端设计3…

【计算机网络】14、DHCP

文章目录 一、概述1.1 好处 二、概念2.1 分配 IP2.2 控制租赁时间2.3 DHCP 的其他网络功能2.4 IP地址范围和用户类别2.5 安全 三、DHCP 消息3.1 DHCP discover message3.2 DHCP offers a message 如果没有 DHCP,IT管理者必须手动选出可用的 ip,这太耗时了…

每天五分钟计算机视觉:AlexNet网络的结构特点

本文重点 在前面的一篇文章中,我们对AlexNet网络模型的参数进行了详细的介绍,本文对其网络模型的特点进行总结。 特点 1、AlexNet的网络结构比LeNet5更深,模型包括5个卷积层和3个全连接层。参数总量大概为249MB。 2、Alex使用了ReLu激活函…

【vSphere 8 自签名 VMCA 证书】企业 CA 签名证书替换 vSphere VMCA CA 证书Ⅱ—— 创建和添加证书模板

目录 3. 使用 Microsoft 证书颁发机构创建 VMCA 证书模板3.1 打开 Certificate Template Console3.2 复制模板修改 Compatibility 选项卡修改 General 选项卡修改 Extensions 选项卡确认新模板 4. 将新模板添加到证书模板4.1 打开 Certificate Console4.2 创建证书模板 关联博文…

高端大气简历模板(精选8篇)

想要让简历在众多求职者中脱颖而出,吸引HR的眼球吗,可以看看这8篇精选的高端大气简历模板!本文为大家提供了多种行业、职位的简历案例,助大家打造一份令人惊艳的简历,轻松斩获心仪职位! 高端大气简历模板下…

【FPGA图像处理实战】- 图像基础知识

视频图像处理是FPGA主要应用方向之一,很多FPGA从事或准备进入这一领域,我们现在开始发布新的FPGA实战专栏——FPGA图像处理。 FPGA处理视频图像处理的主要优势是流水线和并行处理运算,特别是现在视频分辨率越来越大,从720p到1080…

机械臂运动规划、抓取末端执行器、抓取开源项目

运动规划 1.1已有抓取点 假设抓取点已检测到。这些方法设计了从机器人手到目标物体抓取点的路径。这里运动表示是关键问题。虽然存在从机器人手到目标抓握点的无限数量的轨迹,但是由于机器人臂的限制,许多区域无法到达。因此,需要对轨迹进行…