数据结构---二叉树

news2024/11/17 7:39:39

坚持看完,结尾有思维导图总结

这里写目录标题

  • 什么是二叉树?
    • 二叉树的定义
    • 二叉树的性质
  • 二叉树的基石在哪里?
  • 总结

什么是二叉树?

二叉树的定义

二叉树,就是从一个根开始,按照两边分支的方式向下生长的树,就能看成二叉树
在这里插入图片描述
二叉树有这些特性

  1. 可以区分成根节点,左子树和右子树,有序
  2. 不存在度大于2的节点

并且要区分一下几种情况
在这里插入图片描述

二叉树的性质

常用的有以下性质:

  1. 如果首个根节点的层数是 1 ,那么深度为 h 的二叉树最大节点数是 2^h - 1
  2. 一个非空二叉树第 i 层上最多有 2^(i - 1) 个结点
  3. 对于任何一个二叉树,如果一个有度为 0 的叶节点个数为 n0, 度为2的节点个数是 n2 个 ,可以得到 n0 = n2+1
  4. 如果首节点层数是 1 ,那么拥有 n 个结点的满二叉数的深度 h = log2(n + 1)

二叉树的基石在哪里?

二叉树的基石在遍历,二叉树有四种遍历方式
前序遍历,中序遍历,后序遍历,层序遍历
不是构建二叉树什么的,而是给定一个二叉树的不同方式的访问更加重要

之后会用动图来说明谦前序遍历,中序遍历,后续遍历和层序遍历
然后给出程序实现
首先先定义二叉树的节点,拥有存储数据,左节点和右节点

typedef int TreeDate;
typedef struct TreeNode{
 TreeDate val;
 struct TreeNode* left;
 struct TreeNode* right;
}TreeNode ;

前序遍历
步骤
先访问根节点,
然后访问左子树,
之后再访问右子树
在这里插入图片描述
通过分析,访问节点的顺序是
3 8 2 NULL 3 NULL 4 0 NULL NULL 1 NULL NULL

//访问没有返回值,传入根节点
void PreOrder(TreeNode* root)
{
	//遇到空节点返回
	if(root == NULL)
	{
		return;
	}
	//打印根节点
	printf("%d",root->TreeDate);
	//访问左右子树
	PreOrder(root->left);
	PreOrder(root->right);
}

程序执行的结果是

在这里插入图片描述

中序遍历
按照先左子树,再根节点,再右子树的顺序遍历
在这里插入图片描述

//访问没有返回值,传入根节点
void MidOrder(TreeNode* root)
{
	//遇到空节点返回
	if(root == NULL)
	{
		return;
	}

	//访问左子树
	MidOrder(root->left);
	//打印根节点
	printf("%d",root->TreeDate);
	//访问右子树
	MidOrder(root->right);
}

我们可以发现,和上面的程序除了打印的顺序和递归的顺序不一样,其余的都相同
后序遍历
先访问右子树,再访问左子树,最后访问根节点

void BackOrder(TreeNode* root)
{
	//遇到空节点返回
	if(root == NULL)
	{
		return;
	}

	//访问左子树
	BackOrder(root->left);
	//打印根节点
	printf("%d",root->TreeDate);
	//访问右子树
	BackOrder(root->right);
}

层序遍历

层序遍历有些不一样,他的顺序是把每一层走完再走下一层
在这里插入图片描述

我们要借助栈来实现遍历
在这里插入图片描述
对应的顺序是
3 8 4 2 NULL 0 1 NULL 3 NULL NULL NULL NULL
程序执行结果

在这里插入图片描述

总结

在这里插入图片描述

希望大家看完,能够有所收获
如果有错误,请指出我一定虚心改正
动动小手点赞
鼓励我输出更加优质的内容

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

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

相关文章

python虚拟环境的概念,用法(pycharm)

1.在PyCharm中创建python项目时,需要配置python的运行环境,除了使用系统现有环境以外,还可以创建虚拟环境。 2.虚拟环境的创建是因为在实际开发中需要同期用到不同版本的python解释器,不同的第三方库以及同一个第三方库的不同版本…

Qt音视频开发08-ffmpeg内核优化(极速打开/超时回调/实时响应)

一、前言 最初编写这套视频解析组件的时候,面对的场景是视频监控行业,对应设备都是网络监控摄像机,传过来的都是rtsp这种视频流,做过这一块的人都知道,打开某个视频流默认耗时比较大,基本上在2s左右&#…

高级前端二面手写面试题(边面边更)

解析 URL Params 为对象 let url http://www.domain.com/?useranonymous&id123&id456&city%E5%8C%97%E4%BA%AC&enabled; parseParam(url) /* 结果 { user: anonymous,id: [ 123, 456 ], // 重复出现的 key 要组装成数组,能被转成数字的就转成数字…

四【Servlet基础】文件配置及环境搭建(重要)

文章目录4.1 Servlet概念4.2 Servlet作用4.3 Servlet开发步骤4.3.1 搭建开发环境4.3.2 创建项目4.3.3 部署Servlet4.3.4 配置Servlet4.3.5 测试运行4.1 Servlet概念 (1)Servlet:Server Applet的简称,是运行在Web服务器端的Java程…

GDB无法debug的错误

GDB无法debug的错误 一、输出错误信息描述 Warning: opening /proc/PID/mem file for lwp 707.707 failed: No such file or directory (2) Warning: Cannot insert breakpoint 1. Cannot access memory at address 0x806950 二、解决方法 方法:修改 GDB 的二进…

spring之IoC注解(三)负责注入的注解

文章目录前言一、Value注解Product类spring配置文件测试程序运行结果二、Autowired与Qualifier注解1.创建OrderDao接口2.创建OrderDao接口实现类3.创建OrderService类4.配置文件5.测试程序6.运行结果三、Resource注解(重要)1、创建StudentDao接口2、创建…

皮带断裂识别检测系统 opencv

皮带断裂识别检测系统通过opencv深度学习yolo计算机视觉识别技术对皮带运行状态进行全天候实时监测,当识别到皮带断裂撕裂时立即抓拍告警存档。OpenCV-Python是一个Python绑定库,旨在解决计算机视觉问题。OpenCV-Python使用Numpy,这是一个高度…

LeetCode刷题复盘笔记—一文搞懂动态规划之392. 判断子序列问题(动态规划系列第三十八篇)

今日主要总结一下动态规划的一道题目,392. 判断子序列 题目:392. 判断子序列 Leetcode题目地址 题目描述: 给定字符串 s 和 t ,判断 s 是否为 t 的子序列。 字符串的一个子序列是原始字符串删除一些(也可以不删除&a…

08 LIN

基础知识 LIN的全称为Local Interconnect Network。LIN主要功能是为CAN总线网络提供辅助功能,应用场合有智能传感节点、自动车窗节点等。 硬件 特点 1.采用单主多从的组网方式,无CAN总线那样的仲裁机制,最多可连接16个节点(1主…

大数据技术——HBase安装配置DDLDML操作

HBase文章目录1. HBase 安装1.1 HBase下载1.2 HBase安装1.3 HBase 初始配置2. 配置高可用并且群起集群2.1 HBase高可用2.2 群起集群2.3 进入HBase客户端3. DDL&DML操作3.1 DDL操作3.2 DML操作1. HBase 安装 1.1 HBase下载 HBase下载官方网站直达 选择自己需要的版本&…

Allegro孔和线被做到器件里面如何解锁操作指导

Allegro孔和线被做到器件里面如何解锁操作指导 在做PCB设计的时候,会遇到孔和线被做到器件的情况,当需要移动器件的时候,孔和线也会跟着移动。如下图 具体操作如下 选择Route选择Convert Fanout

Acwing 796子矩阵的和

Acwing 796子矩阵的和 前缀和 更新 (前缀和数组):s[i][j]s[i-1][j]s[i][j-1]-s[i-1][j-1]a[i][j] 查询(x1,y1)-------(x2,y2)矩阵的元素和 Ss[x2][y2]-s[x-1][y2]-s[x2][y1-1]s[x1-1][y1-1] 输入一个 n 行 m 列的整数矩阵,再输入 q 个询问,每…

QML教程(二)视觉对象

目录 一、矩形类型:Rectangle 二、图像类型:Image 三、基类类型:Item 一、矩形类型:Rectangle 矩形是最基本的视觉效果,Qt Quick提供了一个矩形类型来绘制矩形。这些矩形可以用颜色或垂直渐变着色。矩形类型还可以在…

【Linux】进程程序替换及shell的模拟实现

​🌠 作者:阿亮joy. 🎆专栏:《学会Linux》 🎇 座右铭:每个优秀的人都有一段沉默的时光,那段时光是付出了很多努力却得不到结果的日子,我们把它叫做扎根 目录👉进程程序替…

Mybatis-Plus 映射匹配兼容性

目录 问题一:表字段与编码属性设计不同步 问题二:编码中添加了数据库中未定义的属性 问题三:采用默认查询开放了更多的字段查看权限 TableField 问题四:表名与编码开发设计不同步 TableName 从表中查询出数据,并…

31.项目部署

目录 1 一些概念 1.1 项目部署 1.2 WSGI 1.3 uWSGI 1.4 Nginx 2 安装环境与迁移项目 2.1 项目内容 2.2 项目配置 2.2.1 DEBUG 2.2.2 STATIC_ROOT 2.2.3 ALLOWED_HOST 3 uWSGI 3.1 安装uWSGI 3.2 配置uWSGI 3.3 启动 uWSGI 3.4 停止 uWSGI 4 …

官方更新:基于VRA Tokenomics 社区常见问题解答

您好 Verasity 社区, 我们最近通过 Medium 发布了最新的代币经济学,您可以在此处阅读。 我们引入了一些新概念来促进我们作为产品的增长,例如我们的企业收购基金,我们还澄清了我们的流通和总供应量。 在我们的代币经济学文章发布…

SpringBoot概念、创建、运行、Spring Boot 配置文件

Spring Boot 就是 Spring 框架的脚⼿架,它就是为了快速开发 Spring 框架⽽诞⽣的。 1.Spring Boot 优点 快速集成框架,Spring Boot 提供了启动添加依赖的功能,⽤于秒级集成各种框架。内置运⾏容器,⽆需配置 Tomcat 等 Web 容器…

c++11 标准模板(STL)(std::deque)(五)

定义于头文件 <deque> std::deque 迭代器 返回指向容器第一个元素的迭代器 std::deque<T,Allocator>::begin, std::deque<T,Allocator>::cbegin iterator begin(); (C11 前) iterator begin() noexcept; (C11 起) const_iterator begin() const; (C11 前)…

Spring简介及IOC使用

Spring介绍 官网&#xff1a;https://spring.io/ Spring是一个对象的容器&#xff0c;负责管理对象的创建、销毁&#xff0c;以及对象的属性注入&#xff0c;对象的之间的依赖关系。 Spring可以整合其它框架&#xff0c;他基于IOC和AOP来构架多层JavaEE系统&#xff0c;以帮助分…