【Java】二叉树:数据海洋中灯塔式结构探秘(上)

个人主页 🌹:喜欢做梦


二叉树中有一个树,我们可以猜到他和树有关,那我们先了解一下什么是树,在来了解一下二叉树

一🍝、树型结构

1🍨.什么是树型结构?

树是一种非线性的数据结构,它是由n(n>=0)个有限节点(结点)和边组成的层次结构的集合。有一个特定的节点为根节点,其余节点通过边连接形成的分支,每个节点可以有零个或多个子节点。把它叫做树是因为它看起来像一颗倒挂的树,也就是说它是根朝上,而叶朝下的。

什么是线性结构?什么是非线性结构?

线性结构:数据元素呈现一对一的线性关系,除第一个和最后一个元素外,每个元素都有且仅有一个直接前驱和一个直接后继;

非线性结构:数据元素之间的关系不是简单的一对一,一个元素可能有多个前驱或后继,或者两者都有。

  • 树的定义是递归的
  • 除根节点外每一个结点都能引出一颗子树;
  • 树型结构中,子树之间不能有交集,否则就不是树型结构; 
  • 除了跟节点之外,每个节点有且只有一个父节点
  • 一个N个节点的树有N-1条边,因为根节点的上方没有边;

2🍩.什么是非树型结构?

非树:节点间的连通性复杂,可能存在多个路径连接统一对节点,也肯存在孤立节点,即与其他节点无连接。

3🍪.树型结构的基本性质

  • 结点的度一个结点含有子树的个数称为该结点的度;如上图,A的度为3,C的度为2;
  • 树的度:一颗树中,所有结点度的最大值称为结点的度;如上图,树的度为4;
  • 叶子结点或终端结点度为0节点称为叶结点;如上图,E、F、G、P等结点为叶节点;
  • 孩子结点或子结点:一个结点含有子树的根结点称为该结点的子结点即只有根节点的结点才是子节点;如上图,B是A的孩子结点;
  • 双亲结点或父亲结点:若一个结点含有子结点,则这个树称为该结点的父结点;如图上A是B的父节点;
  • 根结点:一个树没有双亲的结点;如上图,A;
  • 结点的层次:从根开始定义,根为第一层,根的子结点为第二层,一次类推;
  • 树的高度或深度:树中结点的最大层次;如上图,树的高度为4;
  • 以下只需了解的概念:
  • 非终端结点或分支结点除根结点外,度不为0的结点;如上图:B、C、D、H为分支节点;
  • 兄弟结点:具有相同父结点的结点互称为兄弟结点;如上图:B、C是兄弟结点;
  • 堂兄弟结点不具有同一个父结点,但双亲在同一层的结点互为堂兄弟;如上图,G和H;
  • 结点的祖先:从根到该结点所经分支的所有结点;如上图,A就是所有结点的祖先;
  • 子孙:以某结点为根的子树中的任一节点,都称为该结点的子孙。如上图,所有结点都是A的子孙;
  • 森林:有m(m>=0)互不相交的树组成的集合称为森林;

4🍨.树的表现形式(了解)

树的表现形式有很多种,如双亲表示法,孩子表示法、孩子双亲表示法、孩子兄弟表示法等等。这里简单了解一下其中最常见的方法就是孩子兄弟表示法:

class Node{public int value;//数据public Node firstChild;//第一个孩子public Node nextBrother;//下一个兄弟
}

二🍝、二叉树

1🍑.什么是二叉树?

二叉树:二叉树是每个结点最多有两科子树的树的结构,其两个子树通常称为左子树和右子树

二叉树的递归定义:

  • 或者是一颗空树;
  • 或者是一颗由一根结点和两课互不相交的分别称为左子树和右子树所组成的非空数,左子树和右子树又同样是二叉树;

特点:
  • 度的限制:结点的度最大为2;
  • 有序性:左右子树由顺序,即使某节点只有一颗子树,也要区分左右子树;

性质:

  • 若规定的根节点层数为1,这一棵非空二叉树的第i层上最多有2^{i-1}(i>.0)个节点;
  • 若规定只有根节点的二叉树的深度为1,则深度为k的二叉树的最大节点数是2^{k}-1(k>=0);
  • 对于任何一棵二叉树,如果其叶节点个数为n0,度为2的非叶节点个数为n2,则有n0=n2+1;

2🍑.二叉树的类型

1.满二叉树

满二叉树:每一层的结点树都达到最大,除最后一层外每个节点都有两个节点。

特点:
  • 节点度数:除最后一层的叶子节点外,其他层的每一个的节点都有两个节点,即度都为2;
  • 叶子节点:所有的叶子节点都在同一层,且叶子节点的数量为2^{k-1},k为数的高度;
  • 节点总数: 节点总数是2^{k}-1

2.完美二叉树

完美二叉树:除最后一层外,其余层节点数都达到最大,最后一层节点从左到右依次按顺序排列,可通过数组的高效和访问,完美二叉树是满二叉树的一种

特点:
  • 节点度数:除了底层的叶子节点外,其余所有节点都有两个子节点,即度数均为2;
  • 叶子节点分布:所有叶子节点都在同一层,这使得树的结构呈现出完美的形态;
  • 具有n个节点的完全二叉树的深度k为\log_{2}(n+1)上取整进1; 
  • 节点数量:对于具有n个节点的完全二叉树,如果按照从上至下从左至右的顺序对所有节点从0开始编号,这对于序号为i的节点有:
  • 若i>0,双亲序号:(i-1)/2;i=0,i为根节点的编号,无双亲节点;
  • 若2i+1<n,左孩子序号:2i+1,否则无左孩子;
  • 若2i+1<n,右孩子序号:2i+2,否则无右孩子; 

3🍪.二叉树的创建

public class BinaryTree {public 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');//连接节点A.left=B;A.right=C;B.left=D;B.right=E;C.left=F;C.right=G;return A;}
}

4.二叉树的遍历

二叉树的遍历是指按照一定的顺序访问二叉树中的每个节点,且每个节点仅被访问一次

二叉树的遍历方式主要有前序遍历、中序遍历、后序遍历;

前序遍历

前序遍历:遍历顺序是先访问根的的节点—>左子树—>右子树,也就是根、左、右;

 前序遍历代码:

// 前序遍历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;}//遍历左子树preOrder(root.left);System.out.print(root.val+ " ");//遍历右子树preOrder(root.right);}

 

 

  • 顺序:左子树--根节点--右子树;
  • 根结点的打印位置:中间;
 后序遍历

 后序遍历:遍历顺序是先访问左子树—>右子树—>根的的节点,也就是左、根、右;

    // 后序遍历public void postOrder(TreeNode root){//判断是否有节点,没有返回if(root == null){return;}//遍历左子树preOrder(root.left);//遍历右子树preOrder(root.right);System.out.print(root.val+ " ");}
}

后序遍历的过程与前面的也是同理,就不画图过多解释了。 

  • 顺序:左子树--右子树--根节点;
  • 根结点的打印位置:最后一个;
三者之间的区别:
前序遍历中序遍历后序遍历
访问顺序根、左、右左、根、右左、右、根
根节点访问位置第一个中间最后一个
应用场景二叉树结构、将表达式树转换为前缀表达式用于输出有序序列,还能辅助将表达式树转换为中缀表达式二叉树的高度、节点数,以及释放二叉树内存

层序遍历

层序遍历:从上至下,从左至右逐层访问就是层序遍历。

层序遍历的代码,我后期补上,或者下篇在写,这篇就到这里啦~ 

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

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

相关文章

Lucene(2):Springboot整合全文检索引擎TermInSetQuery应用实例附源码

前言 本章代码已分享至Gitee: https://gitee.com/lengcz/springbootlucene01 接上文。Lucene(1):Springboot整合全文检索引擎Lucene常规入门附源码 如何在指定范围内查询。从lucene 7 开始&#xff0c;filter 被弃用&#xff0c;导致无法进行调节过滤。 TermInSetQuery 指定…

xiaolin coding 图解网络笔记——HTTP篇

1. HTTP 是什么&#xff1f; HTTP 是超文本传输协议&#xff08;HyperText Transfer Protocol&#xff09;&#xff0c;一个用在计算机世界里专门在【两点】之间【传输】文字、图片、音频、视频等【超文本】数据的【约定和规范】。 2. HTTP 常见的状态码有哪些&#xff1f; …

51c深度学习~合集8

我自己的原文哦~ https://blog.51cto.com/whaosoft/12491632 #patchmix 近期中南大学的几位研究者做了一项对比学习方面的工作——「Inter-Instance Similarity Modeling for Contrastive Learning」&#xff0c;主要用于解决现有对比学习方法在训练过程中忽略样本间相似关系…

力扣面试经典 150(下)

文章目录 二叉树的层次遍历82. 二叉树的右视图83. 二叉树的层平均值84. 二叉树的层序遍历85. 二叉树的锯齿形层序遍历 二叉搜索树86. 二叉搜索树的最小绝对差87. 二叉搜索树中第K 小的元素88. 验证二叉搜索树 图89. 岛屿数量90. 被围绕的区域91. 克隆图92. 除法求值93. 课程表9…

Web3的核心技术:区块链如何确保信息安全与共享

在互联网不断迭代的进程中&#xff0c;Web3被视为下一代互联网的核心发展方向&#xff0c;其目标是构建更加开放、安全、去中心化的数字生态。在这一过程中&#xff0c;区块链作为核心技术&#xff0c;为信息安全与共享提供了全新解决方案。本文将深入探讨区块链如何在Web3中实…

Leetcode 生命游戏

以下是上述Java代码的算法思想及其逻辑的中文解释&#xff1a; 算法思想 这段代码实现了LeetCode第289题“生命游戏”的解决方案。核心思想是&#xff1a; 利用原地修改的方式&#xff08;in-place&#xff09;存储下一状态的变化&#xff1a; 通过引入额外的状态值&#xff0…

JavaScript 中 arguments、类数组与数组的深入解析

博客主页&#xff1a; [小ᶻZ࿆] 本文专栏: 前端 文章目录 &#x1f4af;前言&#x1f4af;什么是 arguments 对象2.1 arguments 的定义2.2 arguments 的特性2.3 使用场景 &#x1f4af;深入了解 arguments 的结构3.1 arguments 的内部结构arguments 的关键属性 3.2 类数组…

设计模式-创建型-抽象工厂模式

1.概念 工厂方法模式只能生产一个产品系列&#xff0c;抽象工厂可以生产多个产品系列 2.作用 多个具体产品组成一个产品族&#xff08;产品系列&#xff09;&#xff0c;一个具体工厂负责生产一个产品族 3.应用场景 系统所需产品间由依赖关系&#xff0c;可以划分为同一产…

结合第三方模块requests,文件IO、正则表达式,通过函数封装爬虫应用采集数据

#引用BeautifulSoup更方便提取html信息&#xff1b;requests模块&#xff0c;发生http请求&#xff1b;os模块&#xff0c;文件写入import requests from bs4 import BeautifulSoup import os#当使用requests库发送请求时&#xff0c;如果不设置User - Agent&#xff0c;默认的…

操作系统基础——针对实习面试

目录 操作系统基础什么是操作系统&#xff1f;简述其主要功能请举例几种不同类型的操作系统&#xff0c;并简要说明它们的特点 操作系统基础 什么是操作系统&#xff1f;简述其主要功能 一、操作系统的定义 操作系统&#xff08;Operating System&#xff0c;简称OS&#xff…

深度学习基础练习:代码复现transformer重难点

2024/11/10-2024/11/18: 主要对transformer一些比较难理解的点做了一些整理&#xff0c;希望对读者有所帮助。 前置知识&#xff1a; 深度学习基础练习&#xff1a;从pytorch API出发复现LSTM与LSTMP-CSDN博客 【神经网络】学习笔记十四——Seq2Seq模型-CSDN博客 【官方双语】一…

ESLint的简单使用(js,ts,vue)

一、ESLint介绍 1.为什么要用ESLint 统一团队编码规范&#xff08;命名&#xff0c;格式等&#xff09; 统一语法 减少git不必要的提交 减少低级错误 在编译时检查语法&#xff0c;而不是等js引擎运行时才检查 2.eslint用法 可以手动下载配置 可以通过vue脚手架创建项…

探索PDFMiner:Python中的PDF解析利器

文章目录 **探索PDFMiner&#xff1a;Python中的PDF解析利器**1. 背景介绍&#xff1a;为何选择PDFMiner&#xff1f;2. PDFMiner是什么&#xff1f;3. 如何安装PDFMiner&#xff1f;4. 简单库函数使用方法4.1 提取文本4.2 获取页面布局信息4.3 提取表格数据4.4 提取图像 5. 应…

徒手从零搭建一套ELK日志平台

徒手从零搭建一套ELK日志平台 日志分析的概述日志分析的作用主要收集工具集中式日志系统主要特点采集日志分类ELK概述初级版ELK终极版ELK高级版ELKELK收集日志的两种形式 搭建ELK平台Logstash工作原理Logstash核心概念环境准备安装部署docker添加镜像加速器安装部署Elasticsear…

02 —— Webpack 修改入口和出口

概念 | webpack 中文文档 | webpack中文文档 | webpack中文网 修改入口 webpack.config.js &#xff08;放在项目根目录下&#xff09; module.exports {//entry设置入口起点的文件路径entry: ./path/to/my/entry/file.js, }; 修改出口 webpack.config.js const path r…

23种设计模式-模板方法(Template Method)设计模式

文章目录 一.什么是模板方法模式&#xff1f;二.模板方法模式的特点三.模板方法模式的结构四.模板方法模式的应用场景五.模板方法模式的优缺点六.模板方法模式的C实现七.模板方法模式的JAVA实现八.代码解析九.总结 类图&#xff1a; 模板方法设计模式类图 一.什么是模板方法模…

MySQL45讲 第二十五讲 高可用性深度剖析:从主备原理到策略选择

文章目录 MySQL45讲 第二十五讲 高可用性深度剖析&#xff1a;从主备原理到策略选择一、MySQL 主备基础原理&#xff08;一&#xff09;主备关系与数据同步&#xff08;二&#xff09;主备切换流程 二、主备延迟分析&#xff08;一&#xff09;主备延迟的定义与计算&#xff08…

VuePress v2 快速搭建属于自己的个人博客网站

目录 为什么用VuePress&#xff1f; 一、前期准备 Node.js 使用主题快速开发 二、VuePress安装 三、个性化定制 修改配置信息 删除不需要的信息 博客上传 四、部署 使用github快速部署 初始化仓库 本地配置 配置github的ssh密钥 部署 为什么用VuePress&#xff…

PostgreSQL常用时间函数与时间计算提取示例说明

文章目录 常用函数与常量to_timestamp(字符串转时间戳、数字转时间戳)date与to_date(字符串转日期、时间戳转日期)interval(时间计算)基本操作与格式混合运算 to_char(各种时间转字符串)extract(提取时间字段&#xff0c;年月日时分秒&#xff0c;周、季度&#xff0c;第几周、…

SlickGrid点击/双击事件

分析 SlickGrid提供了点击事件方法grid.onClick和grid.onDblClick用于捕获用户对表格列的点击&#xff0c;捕获到点击事件之后&#xff0c;修改表格数据&#xff0c;然后使用grid.updateRow方法将修改后的数据更新到表格中。 展示 代码 创建grid&#xff08;HTML&#xff09;…