【数据结构与算法】8.二叉树的基本概念|前序遍历|中序遍历|后序遍历

封面

📚博客主页:爱敲代码的小杨.

✨专栏:《Java SE语法》 | 《数据结构与算法》 | 《C生万物》 |《MySQL探索之旅》 |《Web世界探险家》

❤️感谢大家点赞👍🏻收藏⭐评论✍🏻,您的三连就是我持续更新的动力❤️

🙏小杨水平有限,欢迎各位大佬指点,相互学习进步!


文章目录

  • 1. 树形结构(了解)
    • 1.1 概念
    • 1.2 概念(重要)
    • 1.3 树的表示形式(了解)
    • 1.4 树的应用
  • 2. 二叉树
    • 2.1 概念
    • 2.2 特殊的二叉树
    • 2.3 二叉树的性质
    • 2.4 二叉树的存储
  • 3. 二叉树的基本操作
    • 3.1 前置说明
    • 3.2 二叉树的遍历
      • 1. 前序遍历
      • 2. 中序遍历
      • 3. 后序遍历

1. 树形结构(了解)

1.1 概念

树是一种非线性的数据结构,它是由n(n>=0)个有限节点组成一个具有层次关系的集合。把它叫做树是因为它看起来像一个倒挂的树,也就是说它是根朝上,而叶子朝下。它具有的特点:

  • 有一个特殊的几点,称为根节点,根节点没有前驱节点
  • 除根节点外,其余节点被分成m(m>0)个互不相交的集合 T1、T2、…、Tm,其中每一个集合Ti(1<=i<=m)又是一颗与类似的字数。每颗子树的根节点有且只有一个前驱,可以有0个或多个后继
  • 树是递归定义的。



【注意】:树形结构中,子树间不能有交集,否则就不是树形结构

1.2 概念(重要)

节点的度:一个节点含有子树的个数称为该节点的度;如下图:A的度为2
树的度:一棵树中,所有的节点度的最大值称为树的度;如下图:树的度为3
叶子节点或终端节点:度为0的节点称为叶子节点;如下图:G、H、I、J、F节点为叶子节点
双亲节点或父节点:若一个节点含有子节点,则这个节点称为其子节点的父节点;如下图:A是B的父节点
孩子节点或子节点:一个节点含有的子树的根节点称为该节点的子节点;如下图:B是A的孩子节点
根节点:一棵树中,没有双亲节点的节点;如下图:A
节点的层次:从根节点定义来,根为第1层,根的子节点为第2层,以此类推
树的高度:树中节点的最大层次;如下图:树的高度为4


树的以下概念只需了解,知道是什么意思即可:
非终端节点或分支节点:度不为0的节点;如下图:B、C、D、E节点为分支节点
兄弟节点:具有相同父节点的节点互称为兄弟节点;如下图:B、C是互为兄弟节点
堂兄弟节点:双亲在同一层的节点互为堂兄弟节点;如下图:D、E是互为堂兄弟节点
节点的祖先:从根到该节点所经分支上的所有节点;如下图:A是所有节点的祖先
子孙:以某个节点为根的子树中任一节点都称为该节点的的子孙。如下图:所有的接地那都是A的子孙
森林:由m(m>=0)棵互不相交的树组成的集合称为森林

1.3 树的表示形式(了解)

树的结构相对线性表就比较复杂了,要存储不是起来就比较麻烦了,实际中树有很多种表示方式,如:双亲表示法,孩子表示法,孩子双亲表示法,孩子兄弟表示法等等。我们这里就简单的了解其中最常用的孩子兄弟表示法

class Node {int val; // 树中存储的数据Node firstChild; // 第一个孩子引用Node nextBrother;// 下一个兄弟引用
}


线性结构与树形结构的对比

线性结构树形结构
第一个数据元素:无前驱根节点:无双亲,唯一
最后一个数据元素:无后继叶节点:无孩子,可以多个
中间元素:一个前驱,一个后继中间节点:一个双亲多个孩子

1.4 树的应用

文件系统管理(目录和文件)

2. 二叉树

2.1 概念

二叉树是n(n>=0)个节点的有限集合,该集合或者空集(空二叉树),或者由一个根节点和两颗互不相交的、分别称为根节点的左子树和右子树的二叉树组成。

从上图可以看出:

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

总结:对于任意的二叉树都是由以下几种情况复合而成的

大自然中的二叉树:

2.2 特殊的二叉树

  1. 满二叉树:一颗二叉树,如果每层的节点数都达到最大值,则这课二叉树就是,满二叉树。也就是说,如果一颗二叉树的层数为K,且节点总数是 2K -1,则它就是满二叉树
  2. 完全二叉树:完全二叉树是效率很高的数据结构,完全二叉树是由满二叉树而引出来的。对于深度为K的,有 n 个节点的二叉树,每个节点都与深度为 K 的满二叉树中编号从0至 n-1的节点(从上到下,从左到右,依次存放)——对应时称之为完全二叉树。要注意的是满二叉树是一种特殊的完全二叉树。

2.3 二叉树的性质

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

2.4 二叉树的存储

二叉树的存储结构分为:顺序存储类似于链表的链式存储
二叉树的链式存储是通过一个一个的节点引用起来的,常见的表示方法有孩子表示法和孩子双亲表示法,具体如下:

// 孩子表示法
class Node {int val;// 数据域Node left;// 左孩子的引用,常常代表左孩子为根的整棵左子树Node right; // 右孩子的引用,常常代表右孩子为根的整棵右子树
}
// 孩子双亲表示法
class Node {int val;// 数据域Node left;// 左孩子的引用,常常代表左孩子为根的整棵左子树Node right; // 右孩子的引用,常常代表右孩子为根的整棵右子树Node parent;    // 当前节点的根节点
}

3. 二叉树的基本操作

3.1 前置说明

在学习二叉树的基本操作前,需要先创建一颗二叉树,然后才能学习其相关的基本操作。由于现在大家对二叉树的结构掌握还不够深入,为了降低学习成本,此处手动创建一颗二叉树,快速进入二叉树的学习。

public class BinaryTree {// 节点类static class TreeNode{public char val;public TreeNode left; // 左节点public TreeNode right; // 右节点// 构造方法public TreeNode(char val) {this.val = val;}}// 以穷举的方式 创建一颗二叉树public TreeNode createTree() {TreeNode A = new TreeNode('A');TreeNode B = new TreeNode('B');TreeNode C = new TreeNode('C');TreeNode D = new TreeNode('D');TreeNode E = new TreeNode('E');TreeNode F = new TreeNode('F');TreeNode G = new TreeNode('G');TreeNode H = new TreeNode('H');A.left = B;A.right = C;B.left = D;B.right = E;E.right = H;C.left = F;C.right = G;return A; // 返回根节点}
}

注意:上诉代码并不是创建二叉树的方式。
回顾一下二叉树的概念:

  1. 空树
  2. 非空:根节点,根节点的左子树、根节点的右子树组成的

从概念可以看出:二叉树的定义是递归式的,因此后续的基本操作中都是按照该概念实现的。

3.2 二叉树的遍历

学习二叉树的结构,最简单的方式就是遍历,所谓遍历(Traversal)是指沿着某条搜索路线,依次对树中每个结点均做一次且仅做一次访问。访问结点所做的操作依赖于具体的应用问题(比如:打印节点内容、节点内容加1)。 遍历是二叉树上最重要的操作之一,是二叉树上进行其它运算之基础。

1. 前序遍历

前序遍历的顺序: 根节点-> 左子树 -> 右子树
遍历演示 :
1713939974206.gif
代码 :

// 前序遍历
void preOrder(TreeNode root) {// 判断是否为空树if (root == null) {return;}// 打印当前节点的值System.out.print(root.val + " ");// 递归左子树preOrder(root.left);// 递归右子树preOrder(root.right);
}

2. 中序遍历

中序遍历的顺序: 左子树 -> 根结点 -> 右子树
遍历演示:
1713941722638.gif
代码 :

// 中序遍历
void inOrder(TreeNode root) {if (root == null) {return;}// 递归左子树inOrder(root.left);// 打印当前节点的值System.out.print(root.val + " ");// 递归右子树inOrder(root.right);
}

3. 后序遍历

后序遍历的顺序: 左子树 -> 右子树 -> 根结点
1713941722638.gif
代码:

// 后序遍历
void postOrder(TreeNode root) {if (root == null) {return;}// 递归左子树postOrder(root.left);// 递归右子树postOrder(root.right);// 打印当前节点的值System.out.print(root.val + " ");
}

测试代码:

public class Test {public static void main(String[] args) {BinaryTree binaryTree = new BinaryTree();BinaryTree.TreeNode root = binaryTree.createTree();System.out.print("前序遍历:");binaryTree.preOrder(root);System.out.println();System.out.print("中序遍历:");binaryTree.inOrder(root);System.out.println();System.out.print("后序遍历:");binaryTree.postOrder(root);}
}

运行结果:
image.png

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

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

相关文章

4.3网安学习第四阶段第三周回顾(个人学习记录使用)

本周重点 ①Java入门基础 ②Java方法入门 ③Java面向对象(**重点) ④Java的Maven构建项目工具 ⑤Java其他操作补充 ⑥Java序列化和反序列化 ⑦Url 的DNS 审计链(**难点) ⑧Springboot和前端数据分离(主流使用) ⑨Common Collections(CC链漏洞) 本周主要内容 ①Java入…

使用 Flutter 打造引人入胜的休闲游戏体验

作者 / Zoey Fan 去年&#xff0c;Flutter 休闲游戏工具包进行了一次重大更新。近期在旧金山举办的游戏开发者大会 (GDC) 上&#xff0c;Flutter 首次亮相。GDC 是游戏行业的顶级专业盛会&#xff0c;致力于帮助游戏开发者不断提升开发技能。欢迎您继续阅读&#xff0c;了解开发…

01、创建型-单例模式--只有一个实例

文章目录 前言一、基本介绍1.1 什么是单例模式1.2 为什么要用单例模式1.3 应用场景1.4 单例优缺点 二、单例模式的实现方式2.1 饿汉式单例2.1.1 静态变量方式2.1.2 静态代码块 2.2 懒汉式单例2.2.1 懒汉式单例2.2.2 懒汉式优化①-线程安全2.2.2 懒汉式优化②-双重检查锁2.2.3 懒…

智能人事管理系统:全球团队高效管理之道

在全球化背景下&#xff0c;企业面临着管理分布在各地的员工队伍的挑战。为了确保人力资源管理的高效运作&#xff0c;实现跨地域、跨时区的协同工作&#xff0c;智能化人事管理系统应运而生。本文将重点介绍一款功能全面、智能化的人事管理系统都具备哪些功能&#xff0c;可以…

upload-labs第十七十八关

第十七关 $is_upload false; $msg null;if(isset($_POST[submit])){$ext_arr array(jpg,png,gif);$file_name $_FILES[upload_file][name];$temp_file $_FILES[upload_file][tmp_name];$file_ext substr($file_name,strrpos($file_name,".")1);$upload_file …

【面试必会】线程池创建方式详解

最近面试问道了线程池的创建方式&#xff0c;这里出一篇文章记录下这一知识点&#xff01; 线程池是一种多线程处理形式&#xff0c;处理过程中将任务添加到队列&#xff0c;然后在创建线程后自动启动这些任务。线程池线程都是后台线程。每个线程都使用默认的ThreadFactory创建…

【QT】Ubuntu22.04 配置 QT6.5 LTS

【QT】Ubuntu22.04 配置 QT6.5 LTS 文章目录 【QT】Ubuntu22.04 配置 QT6.5 LTS1.注册QT Group的账号2.安装QT Creator3.启动QT Creator报错from 6.5.0, xcb-cursor0 or libxcb-cursor0 is needed to load the Qt xcb platform plugin.4.运行QT的demoReference 1.注册QT Group的…

JAVASE基础语法(异常、常用类)

一、异常 1.1 什么是异常 异常就是指不正常。是指代码在运行过程中可能发生错误&#xff0c;导致程序无法正常运行。 package com.atguigu.exception;public class TestException {public static void main(String[] args) {int[] arr {1,2,3,4,5};System.out.println(&quo…

【AI写作】未来科技趋势:揭秘DreamFusion的革新力量

首先&#xff0c;这篇文章是基于笔尖AI写作进行文章创作的&#xff0c;喜欢的宝子&#xff0c;也可以去体验下&#xff0c;解放双手&#xff0c;上班直接摸鱼~ 按照惯例&#xff0c;先介绍下这款笔尖AI写作&#xff0c;宝子也可以直接下滑跳过看正文~ 笔尖Ai写作&#xff1a;…

数据库之数据库恢复技术思维导图+大纲笔记

大纲笔记&#xff1a; 事务的基本概念 事务 定义 用户定义的一个数据库操作系列&#xff0c;这些操作要么全做&#xff0c;要么全不做&#xff0c;是一个不可分割的基本单位 语句 BEGIN TRANSACTION 开始 COMMIT 提交&#xff0c;提交事务的所有操作 ROLLBACK 回滚&#xff0c…

Centos之yum安装好玩的命令

1.会动的小火车 我在root下使用的 yum install sl.x86_64sl2.figlet yum install figlet.x86_64figlet 55553.cowsay会说话 yum install cowsay

防火墙详细讲解

目录 介绍 防火墙的特征 防火墙的组成 介绍 防火墙&#xff08;firewall&#xff09;是指一种计算机硬件和软件的结合&#xff0c;将内部网和公众访问网&#xff08;如Internet&#xff09;分开的方法&#xff0c;它实际上是一种隔离技术。防火墙主要由服务访问规则、验证工…

python数字验证码自动识别

&#x1f47d;发现宝藏 前些天发现了一个巨牛的人工智能学习网站&#xff0c;通俗易懂&#xff0c;风趣幽默&#xff0c;忍不住分享一下给大家。【点击进入巨牛的人工智能学习网站】。 在网络上&#xff0c;许多网站和应用程序使用验证码&#xff08;Completely Automated Publ…

MYSQL 存储java.sql.Timestamp类型的数据时,mysql存储时间和java获取到的时间相差8小时

###JAVA JDBC驱动 com.mysql.cj.jdbc.DriverJDBC连接字符串 jdbc:mysql://127.0.0.1:3006/db?useUnicodetrue&characterEncodingUTF8&useLegacyDatetimeCodefalse&serverTimezoneUTCMySQL 时区 show global variables like “%time_zone%”; 问题分析 驱动…

网络安全之SQL注入漏洞复现(中篇)(技术进阶)

目录 一&#xff0c;报错注入 二&#xff0c;布尔盲注 三&#xff0c;sleep延时盲注 四&#xff0c;DNSlogs 盲注 五&#xff0c;二次注入 六&#xff0c;堆叠注入 总结 一&#xff0c;报错注入 报错注入就是在错误信息中执行 sql 语句&#xff0c;利用网站的报错信息来带…

【奶奶看了都会】用 AI做猫咪剧情短片保姆级教程

大家这段时间在刷短视频的时候&#xff0c;是不是经常会刷到那种猫咪剧情短片&#xff0c;配合喵喵喵......的魔性背景音乐&#xff0c;让人看了非常上头。最近这类视频在抖音、视频号、小红书上非常火&#xff0c;今天就来教大家如何制作。 1.GPT4账号准备 我们用到的AI生图…

应用于智能装备制造,钡铼IOy系列模块展现其强大的灵活性和实用性

随着科技的飞速发展&#xff0c;智能制造已经成为工业4.0时代的核心驱动力。在此背景下&#xff0c;钡铼技术推出的IOy系列模块以其独特的设计、卓越的性能以及无可比拟的灵活性与实用性&#xff0c;在智能装备制造领域展现出了强大的技术优势和应用价值。 首先&#xff0c;钡…

HTTP与SOCKS-哪种协议更适合您的代理需求?

网络代理技术是我们日常使用网络时必不可少的一项技术&#xff0c;它可以为我们提供隐私保护和负载均衡的能力&#xff0c;从而保证我们的网络通信更加安全和顺畅。而其中最主流的两种协议就是HTTP和SOCKS。虽然它们都是用于网络代理的协议&#xff0c;但在实际应用中却存在着一…

儿童护眼落地灯哪个牌子好?值得买的五款大路灯分享

近年来&#xff0c;随着近视问题日益严重&#xff0c;消费者越来越倾向于选购能够优化照明环境、减轻眼部压力的护眼落地灯。然而&#xff0c;市场上的护眼落地灯品质良莠不齐&#xff0c;许多品牌为了追求低廉价格和扩大市场份额&#xff0c;不惜采取模仿甚至抄袭的方式&#…

MySQL主从结构搭建

说明&#xff1a;本文介绍如何搭建MySQL主从结构&#xff1b; 原理 主从复制原理如下&#xff1a; &#xff08;1&#xff09;master数据写入&#xff0c;更新binlog&#xff1b; &#xff08;2&#xff09;master创建一个dump线程向slave推送binlog&#xff1b; &#xff…