二叉树的基础概念及遍历

二叉树(Binary Tree)的基础

1、树的概念

1、树的概念

树是一种非线性的数据结构,是由n(n>=0)个有限结点组成一个具有层次关系的集合,将它称为树,是因为在形状上像一颗倒着的树,如下图所示就是一颗二叉树。
在这里插入图片描述
可以发现,对于树中的根节点,没有前驱节点,有多个后驱节点;对于其他节点,有一个前驱节点,有或没有后驱节点。这就是它属于非线性结构的原因,节点的对应关系是一对多并且子树之间不相交,可以用此特点来判断树与非树。

2、树元素的基本概念

结点的度:一个结点含有子树的个数称为该结点的度
树的度:一棵树中,所有结点度的最大值称为树的度
叶子结点或终端结点:度为0的结点称为叶结点
双亲结点或父结点:若一个结点含有子结点,则这个结点称为其子结点的父结点;
孩子结点或子结点:一个结点含有的子树的根结点称为该结点的子结点
根结点:一棵树中,没有双亲结点的结点
树的高度或深度:树中结点的最大层次

3、树的表示形式

我们可以发现,如果要构建出这个结点,必须要有三部分:结点的值、结点的左孩子引用、结点的右孩子引用。我们可以借助类来实现结点的实例化。

class TreeNode {
	public int val;//结点的值
	public TreeNode left;//结点的左孩子引用
	public TreeNode right;//结点的右孩子引用
}

2、二叉树

1、二叉树的概念

一棵二叉树是结点的一个有限集合,该集合:

  1. 或者为空
  2. 或者是由一个根节点加上两棵别称为左子树和右子树的二叉树组成
    二叉树

从二叉树的概念中我们可以发现:

  1. 二叉树不存在度大于2的结点
  2. 二叉树的子树有左右之分,次序不能颠倒,因此二叉树是有序树

2、特殊的二叉树

1、满二叉树:每层的结点数都达到最大值的二叉树,结点总数为2^k-1
2. 完全二叉树:从左到右,从上到下给二叉树的结点编号遍历,如果二叉树在遇到空结点之后的结点都为空,就是完全二叉树。满二叉树是完全二叉树的一种特例。
在这里插入图片描述

3、二叉树的性质

  1. 若规定根结点的层数为1,则一棵非空二叉树的第i层上最多有 (i>0)个结点
  2. 若规定只有根结点的二叉树的深度为1,则深度为K的二叉树的最大结点数是 (k>=0)
  3. 对任何一棵二叉树, 如果其叶结点个数为 n0, 度为2的非叶结点个数为 n2,则有n0=n2+1
  4. 具有n个结点的完全二叉树的深度k为 log2(n+1)上取整
  5. 对于具有n个结点的完全二叉树,如果按照从上至下从左至右的顺序对所有节点从0开始编号,则对于序号为i的结点有:
    若i>0,双亲序号:(i-1)/2;i=0,i为根结点编号,无双亲结点
    若2i+1<n,左孩子序号:2i+1,否则无左孩子
    若2i+2<n,右孩子序号:2i+2,否则无右孩子

4、二叉树的遍历

二叉树的遍历常常采用递归解决,原因是每一个结点的结构相同,处理每一个结点的方式相同,因此可以使用递归来解决重复的子问题。

1、前序遍历

前序遍历的顺序为根节点-左孩子结点-右孩子结点。其中对于左孩子结点也使用相同的遍历顺序,直到遇见空结点为止。利用下图进行举例。
#表示空结点在这里插入图片描述
A-B-D-#,遇到空结点,递进过程结束,回归开始。回到D向右树继续递进,D-#,遇到空结点,递进过程结束,回归开始。回到B向右树继续递进,B-#,遇到空结点,递进过程结束,回归开始。回到A向右树继续递进…
所以前序遍历的结果为:ABDCE

2、中序遍历

中序遍历的顺序为左孩子结点-根节点-右孩子结点在这里插入图片描述
对于A,先遍历B,对于B先遍历D,D-B-A;对于C,先遍历E,A-E-C
所以中序遍历的结果为:DBAEC

3、后序遍历

后序遍历的顺序为左孩子结点-右孩子结点-根节点
在这里插入图片描述
对于A,先遍历B,对于B,先遍历D,D-B;再遍历C,对于C,先遍历E,E-C
所以后序遍历的结果为:DBECA

三种遍历代码实现(递归)

//前序遍历
public void preOrder(TreeNode root) {
	if(root==null) {
		return;
	}
	System.out.print(root.val+" ");
	preOrder(root.left);
	preOrder(root.right);
}
//中序遍历
public void inOrder(TreeNode root) {
	if(root==null) {
		return;
	}
	inOrder(root.left);
	System.out.print(root.val+" ");
	inOrder(root.right);
}
//后序遍历
public void postOrder(TreeNode root) {
	if(root==null) {
		return;
	}
	postOrder(root.left);
	postOrder(root.right);
	System.out.print(root.val+" ");
}

三种递归方式实质上都是利用了子问题的思想,将左右孩子拆出来作为新的树,利用同样的方式处理,十分容易理解。

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

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

相关文章

Elasticsearch Index Shard Allocation 索引分片分配策略

Elasticsearch 索引分片的分配策略说明 在上一篇《索引生命周期管理ILM看完不懂你锤我 》&#xff08;https://mp.weixin.qq.com/s/ajhFp-xBU1dJm8a1dDdRQQ&#xff09;中&#xff0c;我们已经学会了索引级别的分片分配过滤属性&#xff0c;也就是在配置文件中指定当前节点的属…

2024 1.13~1.19 周报

一、本周计划 确定论文题目&#xff0c;重新思考能加的点子&#xff0c;重点在网络架构部分。主要了解了注意力模块如SE、CBAM、CA&#xff0c;在模型中插入注意力模块。读论文。 二、完成情况 2.1 论文题目 基于注意力的Unet盐体全波形反演 想法来源&#xff1a;使用的是二维…

Mermaid使用教程(绘制各种图)

Mermaid使用教程&#xff08;绘制各种图&#xff09; 文章目录 Mermaid使用教程&#xff08;绘制各种图&#xff09;简介饼状图简单的例子应用案例 序列图简单案例应用案例另一个应用案例 甘特图简单案例应用案例一个更为复杂的应用案例 Git图简单案例 总结 简介 本文将主要介…

AWS 专题学习 P5 (Classic SA、S3)

文章目录 Classic Solutions Architecture无状态 Web 应用程序&#xff1a;WhatIsTheTime.com背景 & 目标架构演进Well-Architected 5 pillars 有状态的 Web 应用程序&#xff1a;MyClothes.com背景 & 目标架构演进总结 有状态的 Web 应用程序&#xff1a;MyWordPress.…

CHAPTER 15: 《DESIGN GOOGLE DRIVE》第15章:《设计谷歌驱动器》

近年来&#xff0c;云存储服务如谷歌Drive、Dropbox、Microsoft OneDrive、苹果的iCloud已经变得非常流行。在本章中&#xff0c;你需要设计谷歌开车。 在进入设计之前&#xff0c;让我们花点时间了解一下谷歌驱动。谷歌Drive是一个文件存储和同步服务&#xff0c;可以帮助你存…

第十二篇【传奇开心果系列】Ant Design Mobile of React开发移动应用:内置组件实现酷炫CSS 动画

Ant Design Mobile of React 开发移动应用示例博文系列 第一篇【传奇开心果系列】Ant Design Mobile of React 开发移动应用:从helloworld开始 第二篇【传奇开心果系列】Ant Design Mobile of React 开发移动应用:天气应用 第三篇【传奇开心果系列】Ant Design Mobile of Reac…

FFmpeg之SWScale

文章目录 一、概述二、函数调用结构图三、Libswscale处理数据流程四、重要结构体4.1、SwsContext4.2、SwsFilter 五、重要函数5.1、sws_getContext5.1.1、sws_alloc_context5.1.2、sws_init_context 5.2、sws_scale5.2.1、SwsContext中的swscale()5.2.2、check_image_pointers5…

Vue-30、Vue非单文件组件。

非单文件组件&#xff1a; 一个组件包含n个组件 <!DOCTYPE html> <html lang"en"> <head><meta charset"UTF-8"><title>非单文件组件</title><script type"text/javascript" src"https://cdn.jsde…

项目管理工具--禅道

一.禅道的安装 1.1.安装 二.禅道的使用 ​编辑 三.用产品经理的方式登录 3.1添加产品 3.2提需求 3.3添加产品需求 3.4创建项目 ​编辑 四.项目经理方式登录 ​编辑 4.1关联需求 ​编辑 4.2分解任务 五.测试方式登录 5.1测试建立用例 ​编辑 5.2需要换成项…

(学习日记)2024.01.19

写在前面&#xff1a; 由于时间的不足与学习的碎片化&#xff0c;写博客变得有些奢侈。 但是对于记录学习&#xff08;忘了以后能快速复习&#xff09;的渴望一天天变得强烈。 既然如此 不如以天为单位&#xff0c;以时间为顺序&#xff0c;仅仅将博客当做一个知识学习的目录&a…

K8S--安装Nginx

原文网址&#xff1a;K8S--安装Nginx-CSDN博客 简介 本文介绍K8S安装Nginx的方法。 1.创建Nginx目录及配置文件 mkdir -p /work/devops/k8s/app/nginx/{config,html} 在config目录下创建nginx.conf配置文件&#xff0c;内容如下&#xff1a; # events必须要有 events {wo…

Linux:多线程

目录 1.线程的概念 1.1线程的理解 1.2进程的理解 1.3线程如何看待进程内部的资源? 1.4进程 VS 线程 2.线程的控制 2.1线程的创建 2.2线程的等待 2.3线程的终止 2.4线程ID 2.5线程的分离 3.线程的互斥与同步 3.1相关概念 3.2互斥锁 3.2.1概念理解 3.2.2操作理解…

智能驾驶新浪潮:SSD与UFS存储技术如何破浪前行?-UFS篇

如果说SSD是赛道上的超级跑车&#xff0c;那UFS更像是专为智能汽车定制的高性能轻量化赛车。UFS采用串行接口技术&#xff0c;像是闪电侠一样&#xff0c;将数据传输的速度推向新高&#xff0c;大幅缩短了系统启动时间和应用程序加载时间&#xff0c;这对追求即时反应的ADAS系统…

高级架构师是如何设计一个系统的?

架构师如何设计系统&#xff1f; 系统拆分 通过DDD领域模型&#xff0c;对服务进行拆分&#xff0c;将一个系统拆分为多个子系统&#xff0c;做成SpringCloud的微服务。微服务设计时要尽可能做到少扇出&#xff0c;多扇入&#xff0c;根据服务器的承载&#xff0c;进行客户端负…

Golang 搭建 WebSocket 应用(六) - 监控

我在上一篇文章中&#xff0c;提到了目前的认证方式存在一些问题&#xff0c;需要替换为一种更简单的认证方式。 但是最后发现&#xff0c;认证这个实在是没有办法简单化&#xff0c;认证本身又是另外一个不小的话题了&#xff0c;因此关于这一点先留个坑。 本文先讨论一下另外…

Redis实战之-分布式锁-redission

一、分布式锁-redission功能介绍 基于setnx实现的分布式锁存在下面的问题&#xff1a; 重入问题&#xff1a;重入问题是指 获得锁的线程可以再次进入到相同的锁的代码块中&#xff0c;可重入锁的意义在于防止死锁&#xff0c;比如HashTable这样的代码中&#xff0c;他的方法都…

Qt拖拽事件简单实现

1.相关说明 重写resizeEvent(这个按需重写)、dragEnterEvent(拖拽事件函数)、dropEvent(放下事件函数)&#xff0c;可以将本地图片拖拽到label标签中 2.相关界面 3.相关代码 #include "widget.h" #include "ui_widget.h" #include <QDragEnterEvent>…

A V I F是啥?

AVIF 是一种最近的文件格式,在本文撰写之时,已经得到了 Microsoft Edge 的支持,从而获得了重要的浏览器支持。 !重要提示:我们不再处于黑暗时代,大多数大型 Web 平台通常支持当前版本的浏览器的最新 1 年版本。您可以开始使用 AVIF 与 WebP 回退(回退仅在 2024 年底之前是必要的…

禅道的使用及简介

目录 一.禅道简介1.1 禅道主要功能和特点1.2 禅道官网 二.安装禅道2.1 下载禅道开源版2.2.修改数据库密码 三.登录禅道四.禅道的使用4.1.添加部门权限4.2.添加用户权限4.3.公司名修改4.4、.权限 五.创建产品5.1.产品经理创建产品5.2.添加产品模块5.3.添加产品计划5.4.项目经理的…

TCP/IP 基础知识总结

要说我们接触计算机网络最多的协议&#xff0c;那势必离不开 TCP/IP 协议了&#xff0c;TCP/IP 协议同时也是互联网中最为著名的协议&#xff0c;下面我们就来一起聊一下 TCP/IP 协议。 TCP/IP 的历史背景 最初还没有 TCP/IP 协议的时候&#xff0c;也就是在 20 世纪 60 年代…