【Java数据结构】二叉树相关算法

第一题:获取二叉树中结点个数

        得到二叉树结点个数,如果结点为空则返回0,然后再用递归计算左树结点个数+根结点(1个)+右树结点个数。 

public int nodeSize(Node root){if (root == null)return 0;return nodeSize1(root.left)+nodeSize1(root.right)+1;
}

第二题:获取叶子结点的个数

        得到叶子结点个数和结点总数的做法相同,也是判断是否为空,如果该结点的左子树和右子树的都为空时那么该结点就是叶子结点,总的叶子结点就是左边叶子结点+右边叶子结点。

public int leafSize(Node root){if (root == null)return 0;if (root.left == null && root.right == null)return 1;return leafSize(root.left)+leafSize(root.right);
}

第三题:获取第k层结点的个数

        道理和前面两题是一样,第一层有1个结点,第k层结点个数就是第k-1层的左子树+第k-1层右子树。

public int getNode(Node root, int k){if (root == null){return 0;}if (k == 1){return 1;}return getNode(root.left, k-1)+getNode(root.right, k-1);
}

第四题:获取二叉树高度

        求高度需要左子树高度和右子树高度中最大的那个就是二叉树的高度,加上根结点。

public int getHeight(Node root){if (root == null){return 0;}int left = getHeight(root.left);int right = getHeight(root.right);return Math.max(left,right)+1;
}

第五题:二叉树中是否存在val

         判断二叉树是否存在val,需要以下几步:

  • 判断是否为空
  • 该结点是否与val相同
  • 判断左子树中是否存在与val相同的结点
  • 判断右子树中是否存在与val相同的结点
  • 左右子树都不存在与val相同的结点,那就返回false
public boolean find(Node root, char val){if (root == null){return false;}if (root.val == val){return true;}boolean left = find(root.left, val);if (left == true){return true;}boolean right = find(root.right, val);if (right == true){return true;}return false;
}

第六题:判断两棵树是否相同

100. 相同的树 - 力扣(LeetCode)

        判断两棵树是否相同需要判断四种情况

  1. 两棵树都为空时
  2. 一棵为空,另一棵不为空时
  3. 两颗不为空,但是值不相同
  4. 两棵都不为空,值又相同时,再判断左子树和右子树是否同时符合
public boolean isSameTree(Node p, Node q) {if (q == null && p == null){return true;}if (q != null && p == null || q == null && p != null){return false;}if (q.val != p.val){return false;}return isSameTree(p.left, q.left)&& isSameTree(p.right, q.right);
}

第七题:判断是否是子树

572. 另一棵树的子树 - 力扣(LeetCode) 

         判断大的二叉树中是否存在一个小的二叉树,判断条件:

  • 如果大的二叉树的结点为空,小的二叉树不为空,则不是子树
  • 然后再判断两棵树是否相同,相同也是子树
  • 然后再遍历左子树的每一个结点,如果左子树存在子树返回true即可
  • 判断右子树的每个结点,存在子树则返回true
  • 左右都不存在子树返回false 
public boolean isSubtree(Node root, Node subRoot) {if (root == null){return false;}if (isSameTree(root, subRoot)) {return true;}boolean left = isSubtree(root.left, subRoot);if (left == true){return true;}boolean right = isSubtree(root.right, subRoot);if (right == true){return true;}return false;
}

第八题:反转二叉树

226. 翻转二叉树 - 力扣(LeetCode) 

        反转二叉树,主要就是反转每一个结点的左右子树,如果为空就结束,在这过程中使用了递归,最后返回根结点。

public Node invertTree(Node root) {if(root == null){return null;}Node temp = root.left;root.left = root.right;root.right = temp;invertTree(root.left);invertTree(root.right);return root;
}

第九题:判断是否是平衡二叉树

110. 平衡二叉树 - 力扣(LeetCode) 

        判断是否为平衡二叉树的主要条件是每棵子树的左右子树差值小于等于1;所以一边遍历一边比较差值。但是这个方法还有一个限制就是复杂度高(重复计算),可以直接在求高度是边计算差值。

public boolean isBalanced(Node root) {if(root == null){return false;}int left = getHeight(root.left);int right = getHeight(root.right);if (Math.abs(left - right) > 1){return false;}boolean leftB = isBalanced(root.left);boolean rightB = isBalanced(root.right);return true;
}

第十题:判断是否是对称二叉树

101. 对称二叉树 - 力扣(LeetCode) 

        判断是否对称的依据是根结点左右子树的结点是否对称,如果结构满足对称还需要结点对应的值相同(左子树的左结点需要与右子树的右结点相同)。

public boolean isSymmetric(Node root) {if (root == null){return true;}return isSymmetricChild(root.left, root.right);
}
public boolean isSymmetricChild(Node p, Node q) {if (p == null && q == null){return true;}if (p == null || q == null){return false;}if (p.val != q.val){return false;}return isSymmetricChild(p.left,q.right) && isSymmetricChild(p.right, q.left);
}

第十一题:分层遍历

102. 二叉树的层序遍历 - 力扣(LeetCode) 

        题目所表达的意思是将每一层的元素都进行输出;思路是从根结点开始先进行入队,先输出队列中的队头结点,然后每出一个元素就要将这个元素的左右结点都入队,直至队列为空。

如果需要返回一个链表,那就一次进一层(通过计算器计入队列中一层有多少元素,然后通过循环串联链表,并将串联在链表中的结点的左右结点都入队),直至队中节点为空。

public void levelOrder1(Node root){if (root == null){return ;}Queue<Node> q = new LinkedList<>();q.offer(root);while (!q.isEmpty()){Node cur = q.poll();System.out.print(cur.val+"  ");if (cur.left != null){q.offer(cur.left);}if (cur.right != null){q.offer(cur.right);}}
}

第十二题:最近公共祖先

236. 二叉树的最近公共祖先 - 力扣(LeetCode) 

        最近公共祖先意思就是在一棵树中挑两个结点然后向根结点的方向寻找两个结点最近的交点。所以要找出两个结点所有的情况,经实验总结了三种情况:两个结点同在左边、同在右边、以及一个结点在左边一个结点在右边。思路就是先判空再是如果有一个结点满足是根结点,那就直接返回根节点即可(在一个棵树中没有比根结点更大的祖先了),然后就开始遍历,在左右两边分别遍历,寻找两个结点的位置,然后就是返回最近祖先。

public Node lowestCommonAncestor(Node root, Node p, Node q){if (root == null){return null;}if (p == root || q == root){return root;}Node left = lowestCommonAncestor(root.left, p, q);Node right = lowestCommonAncestor(root.right, p, q);if (left != null && right != null){     //q和p一个在左一个在右return root;}else if (left != null){    //p和q都在左return left;}else{  //p和q都在右return right;}
}

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

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

相关文章

PCM5142集成32位384kHz PCM音频立体声114dB差分输出DAC编解码芯片

目录 PCM5142 简介PCM5142功能框图PCM5142特性 参考原理图 PCM5142 简介 PCM514x 属于单片 CMOS 集成电路系列&#xff0c;由立体声数模转换器 (DAC) 和采用薄型小外形尺寸 (TSSOP) 封装的附加支持电路组成。PCM514x 使用 TI 最新一代高级分段 DAC 架构产品&#xff0c;可实现…

debian中apt的配置与解析

引言 在系统使用过程中&#xff0c;我们可能会遭遇 apt update 操作出现问题&#xff0c;或者 apt upgrade 速度迟缓的情况。这往往是由于所使用软件源本身存在诸如服务器性能不佳、维护不及时等质量问题&#xff0c;同时&#xff0c;软件源服务器与我们所处地理位置的距离较远…

深度学习 Pytorch 张量的线性代数运算

pytorch中并未设置单独的矩阵对象类型&#xff0c;因此pytorch中&#xff0c;二维张量就相当于矩阵对象&#xff0c;并且拥有一系列线性代数相关函数和方法。 在实际机器学习和深度学习建模过程中&#xff0c;矩阵或者高维张量都是基本对象类型&#xff0c;而矩阵所涉及到的线…

ESP8266-01S、手机、STM32连接

1、ESP8266-01S的工作原理 1.1、AP和STA ESP8266-01S为WIFI的透传模块&#xff0c;主要模式如下图&#xff1a; 上节说到&#xff0c;我们需要用到AT固件进行局域网应用&#xff08;ESP8266连接的STM32和手机进行连接&#xff09;。 ESP8266为一个WiFi透传模块&#xff0c;和…

简历_基于 Cache Aside 模式解决数据库与缓存一致性问题。

系列博客目录 文章目录 系列博客目录缓存更新策略总结案例&#xff1a;给查询商铺的缓存添加超时剔除和主动更新的策略 说到解决数据库与缓存一致性的问题&#xff0c;其实就是要解决缓存更新的问题。 缓存更新策略 业务场景: 低一致性需求:使用内存淘汰机制。例如店铺类型的…

XML在线格式化 - 加菲工具

XML在线格式化 打开网站 加菲工具 选择“XML 在线格式化” 输入XML&#xff0c;点击左上角的“格式化”按钮 得到格式化后的结果

python学opencv|读取图像(三十八 )阈值自适应处理

【1】引言 前序学习了5种阈值处理方法&#xff0c;包括(反)阈值处理、(反)零值处理和截断处理&#xff0c;相关文章链接为&#xff1a; python学opencv|读取图像&#xff08;三十三&#xff09;阈值处理-灰度图像-CSDN博客 python学opencv|读取图像&#xff08;三十四&#…

【Vim Masterclass 笔记16】S07L32 + L33:同步练习09 —— 掌握 Vim 宏操作的六个典型案例(含点评课内容)

文章目录 S07L32 Exercise 09 - Macros1 训练目标2 操作指令2.1. 打开 macros-practice.txt 文件2.2. 练习1&#xff1a;将旧版 Python 代码转换为新版写法2.3. 练习2&#xff1a;根据列表内容批量创建 Shell 脚本2.4. 练习3&#xff1a;对电话号码作格式化处理2.5. 练习4&…

数据可视化:让数据讲故事的艺术

目录 1 前言2 数据可视化的基本概念2.1 可视化的核心目标2.2 传统可视化手段 3 数据可视化在知识图谱中的应用3.1 知识图谱的可视化需求3.2 知识图谱的可视化方法 4 数据可视化叙事&#xff1a;让数据讲故事4.1 叙事可视化的关键要素4.2 数据可视化叙事的实现方法 5 数据可视化…

vue | 插值表达式

Vue 是一个用于 构建用户界面 的 渐进式 框架 1. 构建用户界面&#xff1a;基于 数据 动态 渲染 页面 2. 渐进式&#xff1a;循序渐进的学习 3. 框架&#xff1a;一套完整的项目解决方案&#xff0c;提升开发效率↑ (理解记忆规则) 插值表达式&#xff1a; 插值表达式是一种 Vu…

如何在 Rocky Linux 上安装极狐GitLab?

本文分享如何在 Rocky Linux 操作系统上安装极狐GitLab。 相关资料 极狐GitLab 在各种操作系统下的安装指南官网文档 前提条件 一个安装了 Rocky Linux 操作系统的云服务器 可以查看 /etc/os-release 中的信息&#xff0c;确认操作系统信息&#xff1a; NAME"Rocky …

单片机存储器和C程序编译过程

1、 单片机存储器 只读存储器不是并列关系&#xff0c;是从ROM发展到FLASH的过程 RAM ROM 随机存储器 只读存储器 CPU直接存储和访问 只读可访问不可写 临时存数据&#xff0c;存的是CPU正在使用的数据 永久存数据&#xff0c;存的是操作系统启动程序或指令 断电易失 …

二、点灯基础实验

嵌入式基础实验第一个就是点灯&#xff0c;地位相当于编程界的hello world。 如下为LED原理图&#xff0c;要让相应LED发光&#xff0c;需要给I/O口设置输出引脚&#xff0c;低电平&#xff0c;二极管才会导通 2.1 打开初始工程&#xff0c;编写代码 以下会实现BLINKY常亮&…

豆包MarsCode:构造特定数组的逆序拼接

问题描述 思路分析 1. 数组的组成&#xff1a; 我们要根据 i 的不同值拼接出不同长度的子数组。对于每个 i 从 1 到 n&#xff0c;我们要把数字从 n 逆序到 i 拼接成一个子数组。 例如&#xff0c;当 i 1 时&#xff0c;拼接 [n, n-1, ..., 1]。当 i 2 时&#xff0c;拼接 …

使用 Dexie.js 实现 API 数据缓存,减少网络请求

使用 Dexie.js 实现 API 数据缓存&#xff0c;减少网络请求 1. 为什么要使用 Dexie.js 进行 API 数据缓存&#xff1f; 在前端开发中&#xff0c;频繁的 API 请求会带来以下问题&#xff1a; 性能问题&#xff1a;多次请求相同数据会增加网络带宽消耗&#xff0c;导致页面加…

蓝桥杯真题 - 公因数匹配 - 题解

题目链接&#xff1a;https://www.lanqiao.cn/problems/3525/learning/ 个人评价&#xff1a;难度 2 星&#xff08;满星&#xff1a;5&#xff09; 前置知识&#xff1a;调和级数 整体思路 题目描述不严谨&#xff0c;没说在无解的情况下要输出什么&#xff08;比如 n n n …

R语言的文件操作

R语言的文件操作 引言 在数据科学和分析的过程中&#xff0c;文件操作是不可或缺的一部分。R语言作为一种强大的统计计算和图形作图的编程语言&#xff0c;提供了丰富的文件操作函数&#xff0c;使得用户能够方便地读取和保存数据。本文将详细介绍R语言中的文件操作&#xff…

RK3588平台开发系列讲解(NPU篇)NPU 驱动的组成

文章目录 一、NPU 驱动组成二、查询 NPU 驱动版本三、查询 rknn_server 版本四、查询 librknn_runtime 版本沉淀、分享、成长,让自己和他人都能有所收获!😄 一、NPU 驱动组成 NPU 驱动版本、rknn_server 版本、librknn_runtime 版本以及 RKNN Toolkit 版本的对应关系尤为重…

论文阅读:CosAE Learnable Fourier Series for Image Restoration

这是 2024 NeurIPS 上发表的一篇文章&#xff0c;介绍了一种新型的基于傅里叶级数的通用编码器。 Abstract 本文介绍了余弦自动编码器&#xff08;Cosine Autoencoder, CosAE&#xff09;&#xff0c;这是一种新颖的通用自动编码器&#xff0c;它将经典傅里叶级数与前馈神经网…

YOLOv11改进,YOLOv11检测头融合RepConv卷积,并添加小目标检测层(四头检测),适合目标检测、分割等任务

摘要 作者提出了一种简单而强大的卷积神经网络架构,其推理阶段采用与 VGG 类似的网络体结构,仅由一堆 3x3 卷积和 ReLU 组成,而训练阶段的模型具有多分支拓扑。这种训练阶段和推理阶段架构的解耦通过结构重参数化技术实现,因此我们将该模型命名为 RepVGG。 # 理论介绍 Re…