【数据结构 | 二叉树入门】

数据结构 | 二叉树入门

  • 二叉树概念:
    • 二叉树特点:
    • 二叉树的基本形态
      • 特殊二叉树
        • 满二叉树
        • 完全二叉树
    • 二叉树的存储结构
    • 二叉树的遍历
      • 先序遍历
      • 中序遍历
      • 后序遍历
    • 计算二叉树的节点个数
    • 计算叶子节点的个数
    • 树的高度
    • 求第k层节点个数

二叉树概念:

如下图,是一个二叉树,二叉树是一种特殊的树。
在这里插入图片描述

二叉树特点:

  1. 二叉树的每个节点都最多有棵树,所以二叉树的中不存在度大于2的节点。
  2. 二叉树的左右子树是有顺序的,次序不可颠倒
    在这里插入图片描述
    如图,树1树2 就不是同一颗树。

二叉树的基本形态

二叉树具有以下五种基本形态:
(1)空二叉树
(2)只有一个根结点。
(3)根结点只有左子树
(4)根结点只有右子树
(5)根结点既有左子树又有右子树
在这里插入图片描述

特殊二叉树

满二叉树

在一棵二叉树中,如果所有分支结点都存在左子树和右子树并目所有叶子都在同
一层上,这样的二叉树称为满二叉树。

满二叉树:

在这里插入图片描述

完全二叉树

对于未满的<满二叉树> 并且从左到右连续的满二叉树称为完全二叉树。

在这里插入图片描述

以下均不是完全二叉树:
在这里插入图片描述

二叉树的存储结构

对于二叉树的存储一般采用链式存储

二叉树每个结点最多有两个孩子,所以为它设计一个数据域两个指针域是比较自然的想法,我们称这样的链表叫做二叉链表

在这里插入图片描述

在这里插入图片描述

二叉树的遍历

先序遍历

在这里插入图片描述

算法如下:

在这里插入图片描述

对于一般空的节点我们用N表示:
则这棵树的先序遍历为
在这里插入图片描述

//先序遍历
void PrevOrder(TreeNode* root)
{
	if (root == NULL)
	{
		printf("N ");
		return 0;
	}
	printf("%d ", root->data);
	PrevOrder(root->left);
	PrevOrder(root->right);
}

递归示意图如下:
在这里插入图片描述

中序遍历

在这里插入图片描述

算法如下:
在这里插入图片描述

则这棵树的中序遍历为
在这里插入图片描述

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

后序遍历

在这里插入图片描述

算法如下

在这里插入图片描述
则这棵树的后序遍历:
在这里插入图片描述

代码:

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

计算二叉树的节点个数

顾名思义,计算一颗树的节点个数,传入该树的跟节点,采用分治的思路:

在这里插入图片描述
在这里插入图片描述

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

在这里插入图片描述
在这里插入图片描述

计算叶子节点的个数

在这里插入图片描述

递归图如下:

在这里插入图片描述

采用分治的思想,从root开始递归,有叶子节点就返回1,这个二叉树一共三个叶子节点,所以有返回3次1,相加得3.

//叶子节点的个数
int TreeLeafSize(TreeNode* root)
{
	//空 返回0
	if (root == NULL)
	{
		return 0;
	}

	//不是空,是叶子,返回1
	if (root->left == NULL 
		&& root->right == NULL)
		return 1;

	//不是空,也不是叶子,   分治 == 左右子树叶子之和
	return TreeLeafSize(root->left) + TreeLeafSize(root->right);
}

在这里插入图片描述
在这里插入图片描述

树的高度

在这里插入图片描述

递归图如下:

在这里插入图片描述

采用分治的思想:分别计算左数高度右数高度,比较取最大。

代码如下:

//树的高度
int TreeHeight(TreeNode* root)
{
	if (root == NULL)
		return 0;
	int leftHeight = TreeHeight(root->left);
	int rightHeight = TreeHeight(root->right);

	return leftHeight > rightHeight ? leftHeight + 1 : rightHeight + 1;
}

在这里插入图片描述
在这里插入图片描述

求第k层节点个数

在这里插入图片描述

递归图如下:

在这里插入图片描述
还是采用分治思想,当k=1时,返回一个节点数。

代码如下:

//第k层个数
int TreeLevelK(TreeNode* 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);
}

在这里插入图片描述
在这里插入图片描述

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

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

相关文章

【51单片机】延时函数delay的坑——关于无符号整型数据for语句“x >= 0“变成死循环

请认真看看以下延时函数是否正确&#xff0c;并且指出错误&#xff1a;&#xff08;考考C语言功底&#xff09; void delay_ms(unsigned int xms) //delay x ms {unsigned int x,y;for(xxms;x>0;x--)for(y124;y>0;y--); }废话少说&#xff0c;上正确代码&#xff1a; v…

python进阶 -- 日志装饰器详解

日志 日志&#xff1a;记录程序运行的时候&#xff0c;出现的问题&#xff0c;或者说验证流程是否正常 在实际工作中&#xff0c;python的脚本命令一般是放在服务器执行的linux系统 日志其实就是记录程序运行时出现的问题、或者正常的打印&#xff0c;协助出现问题的时解决排查…

以太网交换机——稳定安全,构筑数据之桥

交换机&#xff0c;起源于集线器和网桥等网络通信设备&#xff0c;它在性能和功能上有了很大的发展&#xff0c;因此逐渐成为搭建网络环境的常用的设备。 随着ChatGPT爆发&#xff0c;因为用户量激增而宕机事件频频发生&#xff0c;云计算应用催生超大规模算力需求&#xff0c;…

kubernetes Namespace Labels 详解

写在前面&#xff1a;如有问题&#xff0c;以你为准&#xff0c; 目前24年应届生&#xff0c;各位大佬轻喷&#xff0c;部分资料与图片来自网络 内容较长&#xff0c;页面右上角目录方便跳转 namespace 实现资源分组&#xff0c;label实现业务分组 Namespace 基础理论 最重…

Spring AOP(详解)

目录 1.AOP概述 2.AOP相关术语 3.Spring AOP的原理机制 3.1JDK动态代理 3.2 CGLIB动态代理 3.3简单代码展示 3.3.1JDK动态代理 3.3.2CGLIB动态代理 4.Spring的AOP配置 4.1pom.xml 4.2增强方法 4.3切点 4.4切面 5.基于注解的AOP配置 5.1.创建工程 5.2.增强 5.3AOP…

使用flet创建todo应用

使用 Flet 在 Python 中创建待办事项应用 Create To-Do app in Python with Flet 翻译官网教程https://flet.dev/docs/tutorials/python-todo&#xff0c;对一些地方进行了注释和修改。 安装flet Python版本需要3.8及以上&#xff0c;使用pip安装&#xff1a; pip install…

YY9706.102-2021 医疗设备EMC检测知识-RE

一&#xff1a;RE&#xff08;辐射发射试验&#xff09; 按照GB 4824 6.2.2电磁辐射骚扰限值描述&#xff0c;在相对应的实验室和距离测量时&#xff0c;选择不同的限值进行测量。 以上只列出了1组的A、B类限值&#xff0c;2组设备的限值在6.3章节有介绍&#xff0c;对于我们的…

Backtrader 文档学习-Strategy(下)

Backtrader 文档学习-Strategy&#xff08;下&#xff09; 1. notify_cashvalue # 测试 #notify_cashvalue 方法特点 class Test_Strategy(bt.Strategy): # 策略通用初始参数params ((maperiod1, 5),(maperiod2, 20),(printlog, True), # 写入日志标志(logfilename, Test_…

Vue-8、Vue事件处理

1、点击事件 <!DOCTYPE html> <html lang"en" xmlns:v-model"http://www.w3.org/1999/xhtml" xmlns:v-bind"http://www.w3.org/1999/xhtml"xmlns:v-on"http://www.w3.org/1999/xhtml"> <head><meta charset&quo…

计算机网络—— 概述

概述 1.1 因特网概述 网络、互联网和因特网 网络由若干结点和连接这些结点的链路组成多个网络还可以通过路由器互联起来&#xff0c;这样就构成了一个覆盖范围更大的网络&#xff0c;即互联网&#xff08;或互连网&#xff09;。因特网&#xff08;Internet&#xff09;是世…

react输入框检索树形(tree)结构

input搜索框搜索树形子级内容1. input框输入搜索内容2. 获取tree结构数据3. 与tree匹配输入的内容&#xff0c;tree是多维数组&#xff0c;一级一级的对比输入的内容是否匹配&#xff0c;用forEach循环遍历数据&#xff0c;匹配不到在往下找&#xff0c;直到找到为null &#x…

求求你,别再乱用@Transactional了

求求你&#xff0c;别再乱用Transactional了 文章目录 &#x1f50a;先看个问题&#x1f4d5;情况1情况1结果 &#x1f5a5;️情况2情况2结果 &#x1f4dc; 情况三情况3结果 &#x1f4d8;情况4情况4结果 &#x1f516;先说结论情况1结果情况2结果情况3结果情况4结果&#x1f…

oracle 12c pdb expdp/impdp 数据导入导出

环境 (源)rac 环境 byoradbrac 系统版本&#xff1a;Red Hat Enterprise Linux Server release 6.5 软件版本&#xff1a;Oracle Database 12c Enterprise Edition Release 12.1.0.2.0 - 64bit byoradb1&#xff1a;172.17.38.44 byoradb2&#xff1a;172.17.38.45 (目的&am…

2024年中职网络安全——Windows操作系统渗透测试(Server2105)

Windows操作系统渗透测试 任务环境说明&#xff1a; 服务器场景&#xff1a;Server2105服务器场景操作系统&#xff1a;Windows&#xff08;版本不详&#xff09;&#xff08;封闭靶机&#xff09;需要环境加Q 目录 1.通过本地PC中渗透测试平台Kali对服务器场景进行系统服务…

区块链金融科技:技术融合与挑战应对【文末送书-16】

文章目录 前言一.区块链与金融科技的融合&#xff1a;革新金融格局的技术之光1.1区块链技术简介1.2 区块链在金融科技中的应用 二.智能合约2.1 去中心化金融&#xff08;DeFi&#xff09;2.2区块链对金融科技的影响2.3数据安全性 三.区块链与金融科技【文末送书-16】3.1 粉丝福…

spring Security源码讲解-Sevlet过滤器调用springSecurty过滤器的流程

承接上文 上一节 http://t.csdnimg.cn/ueSAl 最后讲到了过滤器收集完成注入容器&#xff0c;这节我们来讲Security的Filter是怎么被Spring调用的。 我们先看webSecurity的performBuild方法(), ![在这里插入图片描述](https://img-b 也就是说&#xff0c;最终返回的过滤器对象…

如何利用大语言模型(LLM)打造定制化的Embedding模型

一、前言 在探索大语言模型&#xff08;LLM&#xff09;应用的新架构时&#xff0c;知名投资公司 Andreessen Horowitz 提出了一个观点&#xff1a;向量数据库是预处理流程中系统层面上最关键的部分。它能够高效地存储、比较和检索高达数十亿个嵌入&#xff08;也就是向量&…

解码 Elasticsearch 查询 DSL:利用 Elasticsearch 中的 has_child 和 has_parent 查询进行父子文档搜索

今天&#xff0c;让我们深入研究 has_child 查询和 has_parent 查询&#xff0c;这将帮助我们将 2 个不同的文档组合到一个索引中&#xff0c;从而使我们能够将它们与关系关联起来。 这样做会对我们搜索相关文档时有很大帮助。 在使用 has_child 及 has_parent 这种关系时&…

解决 rasa 中 slot 不能为中文的问题

解决 rasa 中 slot 不能为中文的问题 定位问题解决办法 定位问题 slots:姓名:type: textmappings:- type: custom如上的 slot 配置&#xff0c;在 rasa train 时会报以下错误&#xff1a; YamlValidationException: Failed to validate D:\project\python\rasa_test\y\domain…

Ansys Zemax | 如何使用 ZPL 创建用户自定义求解

附件下载 联系工作人员获取附件 本文使用两个示例演示了如何使用 ZPL 创建用户自定义解。第一个示例介绍了如何创建 ZPL 解以确保序列文件中像面的曲率半径等于系统的 Petzval 曲率。第二个示例介绍了如何在非序列元件编辑器 ( Non-Sequential Component Editor ) 中基于其他…