当前位置: 首页 > news >正文

数据结构:二叉树(1)

目录

树的概念

树的表示形式

二叉树

二叉树的性质

题目

二叉树的存储

链式存储

初始化二叉树

二叉树的遍历

前序遍历:根👉左子树👉右子树

 中序遍历:左子树👉根👉右子树

后序遍历:左子树👉右子树👉根

选择题

代码代码!

前序遍历的存储问题 


树的概念

树是一种非线性的数据结构,是由nn>=0)个有限结点组成一个具有层次关系的集合

它像是一颗倒挂的树,即根朝上,叶(结点)朝下

注意:

除了根结点外,每个节点有且只有一个父结点 

一棵n个结点的树由n-1条边


结点的度:一个结点含有子树的个数,上面A的度就是6

树的度:所有结点度的最大值(max(node degree)),上面树的度就是6

叶结点/终端结点:度为0的结点,上面B,C,H,I,K,L,M,N,P,Q就是叶结点

父结点:一个结点如果有条线连着上面一个结点,那上面这个结点就是这个结点的父结点

比如:A是B的父结点

子节点:结点含有的子树的根结点,B是A的子结点

根结点:没有父结点的结点

结点层次:根是第一层,其子结点是第2层。。。。

树的高度:树结点最大层次,树高度为4

分支结点:度不为0的结点,比如:D,E,J....

兄弟结点:有相同父结点的结点

堂兄弟结点:双亲在同一层的结点互为堂兄弟,如H,I就是堂兄弟结点


树的表示形式

孩子兄弟表达法


二叉树

一颗二叉树是结点的一个有限集合,该集合或者为空,或者是由一个根节点加上左子树和右子树的二叉树组成

特点:

二叉树不存在度大于2的结点,所以他的每颗子树都是二叉树

满二叉树:每层结点树都达到最大值。如果一棵二叉树的层数为k,且结点总数是2^k-1,那它就是一棵满二叉树

完全二叉树:对于深度为k,有n个结点的二叉树当且仅当其每一个结点都与深度为K的满二叉树中编号从0n-1的结点一一对应时称之为完全二叉树。

满二叉树是一种特殊的完全二叉树

二叉树的性质

1.若规定的根结点层数是1,那一棵非空二叉树的第i层上最多有2^(i-1)个结点

2.规定只有根结点的二叉树深度为1,则深度为k的二叉树最大结点数是2^k -1

3.对于任意一棵二叉树,如果叶结点个数为n0,度为2的非叶结点个数为n2,则有n0 = n2+1

换句话说,叶结点(度为0)的个数总是要比度为2的结点个数多1个

如上图,叶结点的个数有6个,度为2的结点个数为5个 5+1 = 6

推导公式

等式1:假设一棵树有n个结点,度为0的有n0个,度为1的有n1个,度为2的有n2个,那么

n = n0 + n1 + n2

等式2:一棵n个结点的树有n-1条边

一般的,度为0的结点不会产生边,度为1的结点(n1个)产生n1 * 1条边,度为2的结点(n2个)产生

n2 * 2 条边

那么 n-1 = n1+2*n2

把等式1和2联立,n0+n1+n2-1 = n1 + 2 * n2  -- >   n0 = n2 + 1

4.具有n个结点的完全二叉树的深度k为上取整

5. 对于具有 n 个结点的完全二叉树 ,如果按照 从上至下从左至右的顺序对所有节点从 0 开始编号 ,则对于 序号为 i 的结点有
i>0 双亲序号: (i-1)/2 i=0 i 为根结点编号 ,无双亲结点
2i+1<n ,左孩子序号: 2i+1 ,否则无左孩子
2i+2<n ,右孩子序号: 2i+2 ,否则无右孩子

假设父结点下标是i,则左孩子下标为 2*i+1,右孩子下标是2*i+2

反推,如果孩子下标为i,则父结点下标是(i-1) / 2


题目

偶数个结点的完全二叉树,度为1的结点一定只有1个

而奇数个结点的,度为1的结点为0个

所以可以列个等式

2n = n0 + 1 + n2 = n0 + 1 + n0 - 1

所以 n0 = n      选A


二叉树的存储

分为顺序存储链式存储

顺序存储:堆(可以看看我后面的博客),这篇博客讲链式存储

链式存储


初始化二叉树

目前的思路:

先创建结点,以穷举的方式造一棵二叉树,根据下面这张图来创建

public class BinaryTree {static class TreeNode{public char val;public TreeNode left;public TreeNode right;public TreeNode(char val) {this.val = val;}}public TreeNode root;//创建一棵二叉树,创建成功后返回根结点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;C.left = F;C.right = G;E.right = H;return A;}
}

测试一下

煤油问题😊

二叉树的遍历

遍历指的是沿着某条路线遍历

前序遍历:根👉左子树👉右子树

遇到根就打印

 中序遍历:左子树👉根👉右子树

后序遍历:左子树👉右子树👉根

留一道题,请写出下图的前序,中序和后序遍历(答案在文章末尾)

选择题

首先把这个树画出来

画出来后就很简单了,答案就是A

怎么画出这棵树?

 根结点就是E

注意:后序遍历是可以确定树的根的,就是最后一个字母a

那放到中序遍历中,a的左边b就是左子树,a的右边dce构成右子树

后序遍历里面,a后面的c是一个子树根,根据中序,那d和e就很自然排在c的左和右了

 

画出来就是这样,前序遍历就是abcde

后序遍历确定根是F,那根据中序遍历F前面的ABCDE构成左子树,没有右子树

F后面每一个元素都是前一个元素的根结点,画出来就是这样

层次输出FEDCBA

问题:如果给你前序遍历和后序遍历,可以画出一棵二叉树吗?

不可以。因为前序和后序确定的都是根

代码代码!

    // 前序遍历void preOrder(TreeNode root){if(root == null){return;}System.out.println(root.val + " ");preOrder(root.left);preOrder(root.right);}

有点难理解?其实这段代码的分析过程跟我们在造树的过程差不多 

(图太大了只能截一部分了...)

剩下的俩就很简单了

    // 中序遍历void inOrder(TreeNode root){if(root == null){return;}inOrder(root.left);System.out.println(root.val + " ");inOrder(root.right);}// 后序遍历void postOrder(TreeNode root){if(root == null){return;}postOrder(root.left);postOrder(root.right);System.out.println(root.val + " ");}
前序遍历的存储问题 

144. 二叉树的前序遍历 - 力扣(LeetCode)

给你二叉树的根节点 root ,返回它节点值的 前序 遍历。

遍历思路:遍历到是我就存储进去

class Solution {List<Integer> list = new ArrayList<>();public List<Integer> preorderTraversal(TreeNode root) {if(root == null){return list;}list.add(root.val);preorderTraversal(root.left);preorderTraversal(root.right);return list;}
}

套娃存列表思想

    public List<Integer> preorderTraversal(TreeNode root) {List<Integer> list = new ArrayList<>();if(root == null){return list;}list.add(root.val);List<Integer> leftTree = preorderTraversal(root.left);list.addAll(leftTree);List<Integer> rightTree = preorderTraversal(root.right);list.addAll(rightTree);return list;}

画个图解释一下(只画了左子树) 

每次返回就把拼接好的列表归到父结点的列表中


图片遍历答案

前序:ABDEHCFG

中序:DBEHAFCG

后序:DHEBFGCA

相关文章:

数据结构:二叉树(1)

目录 树的概念 树的表示形式 二叉树 二叉树的性质 题目 二叉树的存储 链式存储 初始化二叉树 二叉树的遍历 前序遍历&#xff1a;根&#x1f449;左子树&#x1f449;右子树 中序遍历&#xff1a;左子树&#x1f449;根&#x1f449;右子树 后序遍历&#xff1a;左子…...

[nlp] chathome—家居装修垂类大语言模型的开发和评估

ChatHome: Development and Evaluation of a Domain-Specific LanguageModel for Home Renovation ChatHome: 家居装修垂类大语言模型的开发和评估 1、摘要: 我们的方法包括两个步骤:首先,使用广泛的家庭装修数据集(包括专业文章、标准文档和网络内容)对通用模型进行后预训…...

http(下)

http的工作流程&#xff1a; 客户端---服务端通信过程 请求----响应的模型 建立连接&#xff1a;tcp/ip协议与服务器建立连接&#xff08;三次握手&#xff09;&#xff0c;客户端向服务器的80端口发送连接请求 发送请求&#xff1a;一旦连接建立之后&#xff0c;客户端就像…...

Python学习基础笔记七十二——IDE集成开发环境

集成开发环境&#xff0c;英文缩写是IDE。 IDE可以帮你更高效地开发项目代码。因为它提供了非常实用的功能&#xff0c;比如项目文件管理、语法高亮、代码导航、自动补齐代码、语法静态检查、调试、版本控制等等。 两款IDE&#xff1a;Pycharm和VSCode。 pycharm中的代码文件都…...

[MQ]Win平台RocketMQ安装启动

1、下载 官网下载地址&#xff1a;https://rocketmq.apache.org/zh/download 2、解压ZIP包 解压rocketmq-all-x.x.x-bin-release.zip到目录。 比如我解压到了E:\Env\MQ_rocket\rocketmq-all-5.1.4-bin-release 3、配置环境变量 ROCKETMQ_HOME 4、RocketMQ JVM内存配置 这个需要…...

vscode工程屏蔽不使用的文件夹或文件的方法

一. 简介 vscode是一款 微软提供的免费的代码编辑软件。 对于 IMX6ULL-ALPHA开发板而言&#xff0c;NXP官方uboot一定会支持不止 IMX6ULL芯片的代码&#xff0c;也不止支持 一种架构&#xff0c;还支持其他芯片或架构的源码文件。 为了方便阅读代码&#xff0c;vscode软件可…...

黑马JVM总结(三十四)

&#xff08;1&#xff09;JMM概述 &#xff08;2&#xff09;JMM-原子性-synchronized java内存模型是如何保证原子性的呢&#xff0c;它是通过synchroized关键字&#xff0c;来达到这个目的的 第一个线程来了进入同步代码块之后&#xff0c;把这个对象加上锁了&#xff0c;…...

[linux]vncserver常用终端命令合集

开启vnc服务&#xff1a;systemctl start vncserver:1.service 关闭vnc服务&#xff1a;systemctl stop vncserver:1.service 重启vnc服务&#xff1a;systemctl restart vncserver:1.service 设置VNC密码: vncpasswd 开启VNC&#xff1a; vncserver :1 关闭VNC&#xff1…...

亚马逊、eBay,速卖通,国际站买家账号支付异常问题解决方法

如何解决下单被砍、封号问题&#xff0c;建议采取以下措施&#xff1a; 买家账号下单&#xff0c;不单纯只是解决支付卡、IP问题就可以了&#xff0c;因为平台大数据风控点很多&#xff0c; 我们防关联具体要解决几个问题 一&#xff1a;要硬件参数的关联、安全码、地区码、…...

Constitutional AI

用中文以结构树的方式列出这篇讲稿的知识点&#xff1a; Although you can use a reward model to eliminate the need for human evaluation during RLHF fine tuning, the human effort required to produce the trained reward model in the first place is huge. The label…...

TDengine 资深研发整理:基于 SpringBoot 多语言实现 API 返回消息国际化

作为一款在 Java 开发社区中广受欢迎的技术框架&#xff0c;SpringBoot 在开发者和企业的具体实践中应用广泛。具体来说&#xff0c;它是一个用于构建基于 Java 的 Web 应用程序和微服务的框架&#xff0c;通过简化开发流程、提供约定大于配置的原则以及集成大量常用库和组件&a…...

数据结构-冒泡排序Java实现

目录 一、引言二、算法步骤三、原理演示四、代码实战五、结论 一、引言 冒泡排序是一种基础的比较排序算法&#xff0c;它的思想很简单&#xff1a;重复地遍历待排序的元素列表&#xff0c;比较相邻元素&#xff0c;如果它们的顺序不正确&#xff0c;则交换它们。这个过程不断重…...

完整教程:Java+Vue+Websocket实现OSS文件上传进度条功能

引言 文件上传是Web应用开发中常见的需求之一&#xff0c;而实时显示文件上传的进度条可以提升用户体验。本教程将介绍如何使用Java后端和Vue前端实现文件上传进度条功能&#xff0c;借助阿里云的OSS服务进行文件上传。 技术栈 后端&#xff1a;Java、Spring Boot 、WebSock…...

【微服务 SpringCloud】实用篇 · 服务拆分和远程调用

微服务&#xff08;2&#xff09; 文章目录 微服务&#xff08;2&#xff09;1. 服务拆分原则2. 服务拆分示例1.2.1 导入demo工程1.2.2 导入Sql语句 3. 实现远程调用案例1.3.1 案例需求&#xff1a;1.3.2 注册RestTemplate1.3.3 实现远程调用1.3.4 查看效果 4. 提供者与消费者 …...

Linux 下I/O操作

一、文件IO 文件 IO 是 Linux 系统提供的接口&#xff0c;针对文件和磁盘进行操作&#xff0c;不带缓存机制&#xff1b;标准IO是C 语言函数库里的标准 I/O 模型&#xff0c;在 stdio.h 中定义&#xff0c;通过缓冲区操作文件&#xff0c;带缓存机制。   标准 IO 和文件 IO 常…...

C#内映射lua表

都是通过同一个方法得到的 例如得到List List<int> list LuaMgr.GetInstance().Global.Get<List<int>>("testList"); 只要把Get的泛型换成对应的类型即可 得到Dictionnary Dictionary<string, int> dic2 LuaMgr.GetInstance().Global…...

android studio检测不到真机

我的情况是&#xff1a; 以前能检测到&#xff0c;有一天我使用无线调试&#xff0c;发现调试有问题&#xff0c;想改为USB调试&#xff0c;但是半天没反应&#xff0c;我就点了手机上的撤销USB调试授权&#xff0c;然后就G了。 解决办法&#xff1a; 我这个情况比较简单&…...

【Eclipse】设置自动提示

前言&#xff1a; eclipse默认有个快捷键&#xff1a;alt /就可以弹出自动提示&#xff0c;但是这样也太麻烦啦&#xff01;每次都需要手动按这个快捷键&#xff0c;下面给大家介绍的是&#xff1a;如何设置敲的过程中就会出现自动提示的教程&#xff01; 先按路线找到需要的页…...

单片机TDL的功能、应用与技术特点 | 百能云芯

在现代电子领域中&#xff0c;单片机&#xff08;Microcontroller&#xff09;是一种至关重要的电子元件&#xff0c;广泛应用于各种应用中。TDL&#xff08;Time Division Multiplexing&#xff0c;时分多路复用&#xff09;是一种数据传输技术&#xff0c;结合单片机的应用&a…...

解决笔记本无线网络5G比2.4还慢的奇怪问题

环境&#xff1a;笔记本Dell XPS15 9570&#xff0c;内置无线网卡Killer Wireless-n/a/ac 1535 Wireless Network Adapter&#xff0c;系统win10家庭版&#xff0c;路由器H3C Magic R2Pro千兆版 因为笔记本用的不多&#xff0c;一直没怎么注意网络速度&#xff0c;直到最近因为…...

GitHub Action 通过SSH 自动部署到云服务器上

准备 正式开始之前&#xff0c;你需要掌握 GitHub Action 的基础语法&#xff1a; workflow &#xff08;工作流程&#xff09;&#xff1a;持续集成一次运行的过程&#xff0c;就是一个 workflow。name: 工作流的名称。on: 指定次工作流的触发器。push 表示只要有人将更改推…...

【AOP系列】7.数据校验

在Java中&#xff0c;我们可以使用Spring AOP&#xff08;面向切面编程&#xff09;和自定义注解来做数据校验。以下是一个简单的示例&#xff1a; 首先&#xff0c;我们创建一个自定义注解&#xff0c;用于标记需要进行数据校验的方法&#xff1a; import java.lang.annotat…...

黑马JVM总结(三十七)

&#xff08;1&#xff09;synchronized-轻量级锁-无竞争 &#xff08;2&#xff09;synchronized-轻量级锁-锁膨胀 重量级锁就是我们前面介绍过的Monitor enter &#xff08;3&#xff09;synchronized-重量级锁-自旋 &#xff08;4&#xff09;synchronized-偏向锁 轻量级锁…...

企业如何通过媒体宣传扩大自身影响力

传媒如春雨&#xff0c;润物细无声&#xff0c;大家好&#xff0c;我是51媒体网胡老师。 企业可以通过媒体宣传来扩大自身的影响力。可以通过以下的方法。 1. 制定媒体宣传战略&#xff1a; - 首先&#xff0c;制定一份清晰的媒体宣传战略&#xff0c;明确您的宣传目标、目标…...

处理vue直接引入图片地址时显示不出来的问题 src=“[object Module]“

在webpack中使用vue-loader编译template之后&#xff0c;发现图片加载不出来了&#xff0c;开发人员工具中显示src“[object Module]” 这是因为当vue-loader编译template块之后&#xff0c;会将所有的资源url转换为webpack模块请求 这是因为vue使用的是commonjs语法规范&…...

vue3 v-md-editor markdown编辑器(VMdEditor)和预览组件(VMdPreview )的使用

vue3 v-md-editor markdown编辑器和预览组件的使用 概述安装支持vue3版本使用1.使用markdown编辑器 VMdEditor2.markdown文本格式前端渲染 VMdPreview 例子效果代码部分 完整代码 概述 v-md-editor 是基于 Vue 开发的 markdown 编辑器组件 轻量版编辑器 轻量版编辑器左侧编辑…...

java正则表达式 及应用场景爬虫,捕获分组非捕获分组

正则表达式 通常用于校验 比如说qq号 看输入的是否符合规则就可以用这个 public class regex {public static void main(String[] args) {//正则表达式判断qq号是否正确//规则 6位及20位以内 0不能再开头 必须全是数子String qq"1234567890";System.out.println(qq…...

基于 Debian 稳定分支发行版的Zephix 7 发布

Zephix 是一个基于 Debian 稳定版的实时 Linux 操作系统。它可以完全从可移动媒介上运行&#xff0c;而不触及用户系统磁盘上存储的任何文件。 Zephix 是一个基于 Debian 稳定版的实时 Linux 操作系统。它可以完全从可移动媒介上运行&#xff0c;而不触及用户系统磁盘上存储的…...

MBR20100CT-ASEMI肖特基MBR20100CT参数、规格、尺寸

编辑&#xff1a;ll MBR20100CT-ASEMI肖特基MBR20100CT参数、规格、尺寸 型号&#xff1a;MBR20100CT 品牌&#xff1a;ASEMI 芯片个数&#xff1a;2 封装&#xff1a;TO-220 恢复时间&#xff1a;&#xff1e;50ns 工作温度&#xff1a;-65C~175C 浪涌电流&#xff1a…...

修炼k8s+flink+hdfs+dlink(五:安装dockers,cri-docker,harbor仓库)

一&#xff1a;安装docker。&#xff08;所有服务器都要安装&#xff09; 安装必要的一些系统工具 sudo yum install -y yum-utils device-mapper-persistent-data lvm2添加软件源信息 sudo yum-config-manager --add-repo https://mirrors.aliyun.com/docker-ce/linux/cent…...

如何做积分商城网站/软文营销写作技巧有哪些?

2019独角兽企业重金招聘Python工程师标准>>> Node 主要用在开发 Web 应用&#xff0c;koa 是目前 node 里最流行的 web 框架。 在 Node 开启一个 http 服务简直易如反掌,官网 demo。 const http require("http");const server http.createServer((req, …...

淘宝上那些做网站seo的管用吗/武汉it培训机构排名前十

1.在MySQL中创建数据库 """创建mysql数据库""" import pymysql # 数据库连接引用类 from pymysql.connections import Connection # 游标操作类 from pymysql.cursors import Cursor# 通过pymysql的方法connect()方法声明一个MySQL连接对象conn。…...

学校网站的建设费用/百度开户代理

许多外贸公司在选择邮箱时&#xff0c;单次群发量和邮箱容量都是客户选择邮箱品牌的必要条件。小编了解到一些做外贸的公司是需要跟海外的客户发邮件业务往来的&#xff0c;所以&#xff0c;他们需要单次群发量非常高&#xff0c;目前小编了解到&#xff0c;还有一些外贸公司的…...

做最好的在线看片网站/东莞做网站seo

庆幸也与你逛过那一段旅程曾是日夜期待你施舍一点同情这算是固执做梦或太热情?在世上没有多少东西会尽如人意多数像讽刺逐年成长必经苦恋故事我爱你你扮作不知完了吧如无意外重今开始该好好恋爱放下从前一段感情才能追求将来你就似没存在完了吧仍能撑起来前进便让自尊心放开告…...

合肥新站开发区管委会网站/武汉seo论坛

使用技术 LR.APP是基于uni-app开发的多端APP/小程序系统&#xff0c;设计理念是解决多端开发问题&#xff0c;使用时&#xff0c;开发者仅需一套代码&#xff0c;即可编译到iOS、Android、H5、小程序等多个平台。 LR.APP封装了跨端兼容的组件和api&#xff0c;如果你不熟悉un…...

用html5做的网站源码/十大经典口碑营销案例

微软推出了两个新的Windows API&#xff0c;以帮助驱动程序开发人员创建更安全的软件。微软已经详细说明了其消除未初始化内存问题的下一步&#xff0c;这次针对的是为Windows构建硬件驱动程序的开发人员使用的未初始化内核池内存。据微软安全响应中心(MSRC)的安全工程师Joe Bi…...