【数据结构(八)上】二叉树经典习题

❣博主主页: 33的博客❣
▶文章专栏分类: Java从入门到精通◀
🚚我的代码仓库: 33的代码仓库🚚
🫵🫵🫵关注我带你学更多数据结构的知识

在这里插入图片描述

目录

  • 1.前言
  • 2.经典习题
    • 2.1相同的树
    • 2.2另一棵子树
    • 2.3翻转二叉树
    • 2.4平衡二叉树
    • 2.5对称二叉树
    • 2.6二叉树的构建及遍历
    • 2.7二叉树的分层遍历
  • 3.总结

1.前言

在上一篇文章中,博主主要介绍了树与二叉树的基本概念、二叉树概念及特性、遍历方式自己实现一棵二叉树,在这篇文章中,博主将继续与大家分享二叉树经典习题。

2.经典习题

2.1相同的树

给你两棵二叉树的根节点 p 和 q ,编写一个函数来检验这两棵树是否相同:OJ链接
解题思路

递归思想:
1.如果p为空,q为空,那么就是两颗空树肯定相等
2.如果一个树为空另一棵树不为空那么一定不相等
3.如果都不为空,值相同才相等。
4.在递归判断左子树是否相等,右子树是否相等,只有左右子树都相等才是相同的树

class Solution {class TreeNode {int val;TreeNode left;TreeNode right;TreeNode() {}TreeNode(int val) { this.val = val; }TreeNode(int val, TreeNode left, TreeNode right) {this.val = val;this.left = left;this.right = right;}}public boolean isSameTree(TreeNode p, TreeNode q) {if(p==null&&q==null){return true;}//p、q有一个为空if(p==null&&q!=null||p!=null&&q==null){return false;}//两个都不为空,不相等if(p.val!=q.val){return false;}//两个都不为空且p=qreturn isSameTree(p.left,q.left)&&isSameTree(p.right,q.right);}
}

2.2另一棵子树

给你两棵二叉树 root 和 subRoot 。检验 root 中是否包含和 subRoot 具有相同结构和节点值的子树:OJ链接
解题思路

递归思想
1.如果其中一个为null那么就不是子树
2.如果是两棵相同的树,那么就为一定为子树
3.再递归看sub是否为左子树的子树,右子树的子树,如果都不是,则返回false

public boolean isSubtree(TreeNode root, TreeNode subRoot) {if(root == null &&subRoot!=null|| subRoot == null&&root!=null) {return false;}if(isSameTree(root,subRoot)){return true;}        if(isSubtree(root.left,subRoot)){return true;}  if(isSubtree(root.right,subRoot)){return true;}return false;}  

2.3翻转二叉树

给你一棵二叉树的根节点 root ,翻转这棵二叉树:OJ链接
解题思路

1.判断是否为空树,判断这棵树是否只有根节点
2.再交换左右子树

public TreeNode invertTree(TreeNode root) {if(root==null||root.left==null&&root.right==null){return root;}TreeNode tmp= root.left;root.left=root.right;root.right=tmp;invertTree(root.left);invertTree(root.right);return root;}

2.4平衡二叉树

给定一个二叉树,判断它是否是 平衡二叉树(左右子树相差不超过1):OJ链接
解题思路

递归思想
1.先求一个树深度
2.求左子树的深度,再求右子树的深度,相差>1则不平衡
3.并且左子树和右子树的每一个个小树都要平衡

public boolean isBalanced(TreeNode root) {if(root==null){return true;}int left=MaxLength(root.left);int right=MaxLength(root.right);if (Math.abs(left-right)<=1&&isBalanced(root.right)&&isBalanced(root.left)){return true;}else {return false;}}public int MaxLength(TreeNode root){if (root==null){return 0;}int Left=MaxLength(root.left);int Right=MaxLength(root.right);return Left>Right?Left+1:Right+1;}

我们观察以上代码,我们发现在求长度的时候已经遍历了一次二叉树,但在求是否平衡的时候,每次递归又会再求高度再遍历数组,效率非常低。那有能不能在求高度的时候就可以判断子树是否平衡呢?答案是可以的,如下:

当求高度的时候先先判断左子树和右子树只差是否小于1,如果小于1就返回-1,就不会再往递归了。

public boolean isBalanced(TreeNode root) {if(root==null){return true;}return MaxLength(root)>0;}public int MaxLength(TreeNode root){if (root==null){return 0;}int Left=MaxLength(root.left);int Right=MaxLength(root.right);if(Left>=0&&Right>=0&&Math.abs(Left-Right)<=1){return Math.max(Left,Right)+1;}else return -1;}

2.5对称二叉树

给你一个二叉树的根节点 root , 检查它是否轴对称:OJ链接
解题思路

1.判断root是否为null
2.比较左子树和右子树是否对称
3.若其中一棵树为null,那么不对称,若都为null则对称
4.再判断,左子树的左节点是否等于右子树的右节点&&左子树的右节点等于右子树的左节点,依次递归。

class Solution {public boolean isSymmetric(TreeNode root){if(root==null){return true;}else {return isSymmetric(root.left,root.right);}}public boolean isSymmetric(TreeNode L,TreeNode R){if(L==null&&R==null){return true;}if(L==null&&R!=null||L!=null&&R==null){return false;}if(L.val!= R.val){return false;}return isSymmetric(L.left,R.right)&&isSymmetric(L.right,R.left);}
}

2.6二叉树的构建及遍历

读入用户输入的一串先序遍历字符串,根据此字符串建立一个二叉树:OJ链接

解题思路

1.遍历字符串,不为#,就new一个Node,但在遍历字符串的时候,我们要把i设置为成员变量防止每次递归后i从0开始
2.遍历二叉树中序输出

class TreeNode{char val;TreeNode left;TreeNode right;public TreeNode(char val) {this.val = val;}
}
public class Main {static int i=0;public static void main(String[] args) {Scanner in = new Scanner(System.in);// 注意 hasNext 和 hasNextLine 的区别while (in.hasNextLine()) { // 注意 while 处理多个 caseString str=in.nextLine();TreeNode root= createTree(str);inOrder(root);}}public static TreeNode createTree(String str) {
//        for (int i=0;i<str.length();i++) {
//            char ch = str.charAt(i);i每次则从0开始TreeNode root=null;if(str.charAt(i)!='#'){root=new TreeNode(str.charAt(i));i++;root.left=createTree(str);root.right=createTree(str);}else {i++;//不要担心i超出字符串长度的问题}return root;}public static void inOrder(TreeNode root){if(root==null){return ;}inOrder(root.left);System.out.print(root.val+" ");inOrder(root.right);}
}

2.7二叉树的分层遍历

分层遍历二叉树:OJ链接
解题思路

我们需要借助队列来实现,当root不为null时,那么我们将root入队,再将它出队打印,出对的时候我们添加左子树,添加右子树,循环上述操作,直到独队列为空。

public void order(TreeNode root){Queue<TreeNode> queue=new LinkedList<>();if(root==null){return;}queue.offer(root);while (!queue.isEmpty()){TreeNode cur=queue.poll();System.out.println(cur.val+" ");if(cur.left!=null){queue.add(cur.left);}if (cur.right!=null){queue.add(cur.right);}}}

除了递归的方式,还可以用非递归的方式:

public List<List<Integer>> levelOrder(TreeNode root) {List<List<Integer>> list=new ArrayList<>();if(root==null){return list;}Queue<TreeNode> queue=new LinkedList<>();queue.offer(root);while (!queue.isEmpty()){int size=queue.size();List<Integer> l=new ArrayList<>();while (size!=0){TreeNode cur=queue.poll();size--;l.add(cur.val);if(cur.left!=null){queue.add(cur.left);}if (cur.right!=null){queue.add(cur.right);}}list.add(l);}return list;}

3.总结

在这篇文章中,博主主要分享了比较容易的一些二叉树题目,我们发现在做二叉树的习题时,大多都有用到递归思想,因为二叉树的子树本身也是一棵二叉树,所以当同学们遇到关于二叉树的问题时,可以往递归方向思考。在下一篇文章中,将继续和大家分享二叉树中比较复杂的题目。

下期预告:二叉树经典习题(下)

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

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

相关文章

直播美颜工具与视频美颜SDK:技术深入探索

直播美颜工具和视频美颜SDK的出现&#xff0c;为直播平台和应用开发者提供了丰富的选择。本文将深入探讨这些技术的原理、应用和发展趋势。 一、美颜算法 直播美颜工具的核心在于其先进的美颜算法。这些算法通过对图像进行分析和处理&#xff0c;实时地修饰主播的面部特征&am…

vsstudio 如何远程调试

你可能需要调试一个在本地生成的 Windows 桌面项目,然后在远程计算机上运行可执行文件。本主题阐释如何更改本地项目设置以在远程计算机上运行应用程序。C++ 项目会自动部署到远程计算机。您将需要手动部署 .NET Framework 可执行文件。 设置 Visual C++ 项目 此处显示的过程…

项目开发流程

项目开发流程 &#x1f469;‍&#x1f9b3;项目立项 估计项目的花费&#xff0c;确定大致的所需开发人员数&#xff0c;确定项目是否可行&#xff1b; &#x1f469;‍&#x1f9b0;需求分析 整体过程&#xff1a; 项目背景和目标&#xff0c;即项目的目的是什么 用户需求&…

SQLAIchemy 异步DBManager封装-01入门理解

前言 SQLAlchemy 是一个强大的 Python SQL 工具包和对象关系映射&#xff08;ORM&#xff09;系统&#xff0c;是业内比较流行的ORM&#xff0c;设计非常优雅。随着其2.0版本的发布&#xff0c;SQLAlchemy 引入了原生的异步支持&#xff0c;这极大地增强了其在处理高并发和异步…

Windows 的常用命令(不分大小写)

Net user &#xff08;查看当前系统所有的账户&#xff09; net user yourname password /add 添加新用户 net localgroup administrators yourname /add 添加管理员权限 net user yourname /delete 删除用户 net user 命令 [colorred]说明&#xff1a;以下命令仅限持管理员…

opencv人脸打马赛克

import cv2def FaceFind(imgPath: str) -> list:image cv2.imread(imgPath)gray cv2.cvtColor(image, cv2.COLOR_BGR2GRAY)face_cascade cv2.CascadeClassifier(haarcascade_frontalface_default.xml)# 返回人脸坐标列表faces face_cascade.detectMultiScale(gray, scal…

数据结构11:二叉树的链式结构

文章目录 快速创建链式二叉树二叉树的遍历前序、中序、后序层序 二叉树的基本操作二叉树的节点个数二叉树叶节点的个数二叉树第k层结点个数二叉树查找值为x的结点 二叉树基础oj练习单值二叉树检查两颗树是否相同对称二叉树二叉树的前序遍历另一颗树的子树 二叉树的创建和销毁二…

谷雨时节,雨水渐多湿气旺盛,吃什么养生?听听张婉如医生怎么说

谷雨春光晓&#xff0c;山川黛色青。 叶间鸣戴胜&#xff0c;泽水长浮萍。 4月19日21时59分迎来谷雨&#xff0c;雨生百谷&#xff0c;这是谷雨节气的意思&#xff0c;它是春季的最后一个节气&#xff0c;这个时节早晚温差大&#xff0c;空气湿气重&#xff0c;如何养生呢&am…

java在线问卷调查系统的设计与实现(springboot+mysql源码+文档)

风定落花生&#xff0c;歌声逐流水&#xff0c;大家好我是风歌&#xff0c;混迹在java圈的辛苦码农。今天要和大家聊的是一款基于springboot的在线问卷调查系统。项目源码以及部署相关请联系风歌&#xff0c;文末附上联系信息 。 项目简介&#xff1a; 基于java的在线问卷调查…

电脑便签怎么固定位置 能固定在桌面的电脑便签

在繁忙的工作中&#xff0c;电脑便签是我离不开的小助手。每当灵感闪现&#xff0c;或是需要记录待办事项时&#xff0c;我总会打开便签&#xff0c;快速地记录下来。它就像我电脑屏幕上的一块“记事板”&#xff0c;随时提醒我未完成的工作和即将到来的任务。 但有一段时间&a…

i管家空间不足提醒怎么关闭

i管家的空间不足提醒是为了提醒用户手机存储空间不足&#xff0c;可能会影响手机的正常运行。目前&#xff0c;这个提醒功能是无法直接关闭的。如果您希望减少这类提醒的出现&#xff0c;可以尝试以下几种方法&#xff1a; 清理手机存储&#xff1a;检查手机中是否有不需要的文…

restful请求风格的增删改查-----查询and添加

一、restful风格的介绍 restful也称之为REST ( Representational State Transfer )&#xff0c;可以将它理解为一种软件架构风格或设计风格&#xff0c;而不是一个标准。简单来说&#xff0c;restful风格就是把请求参数变成请求路径的一种风格。例如&#xff0c;传统的URL请求…

Darknet,看过很多篇,这个最清晰了

Darknet深度学习框架&#xff1a;YOLO背后的强大支持 Darknet&#xff0c;一个由Joseph Redmon开发的轻量级神经网络框架&#xff0c;以其在计算机视觉任务&#xff0c;特别是目标检测中的卓越表现而闻名。本文将详细介绍Darknet的基本概念、结构以及它在深度学习领域的应用。…

UE4_动画基础_根运动Root Motion

学习笔记&#xff0c;仅供参考&#xff01; 在游戏动画中&#xff0c;角色的碰撞胶囊体&#xff08;或其他形状&#xff09;通常由控制器驱动通过场景。然后来自该胶囊体的数据用于驱动动画。例如&#xff0c;如果胶囊体在向前移动&#xff0c;系统就会知道在角色上播放一个跑步…

Kivy Pyinstaller Windows 打包

各种报错 ImportErrorWhenRunningHook: Failed to import module __PyInstaller_hooks_0_kivy required by hook for module 三天美好时光啥也没干&#xff0c;就研究这个了。 打包成功&#xff0c;运行应用程序exe闪退的。终于打包成功了。 这所有的原因都是因为我爱你。如果…

小型架构实验模拟

一 实验需求 二 实验环境 22 机器&#xff1a; 做nginx 反向代理 做静态资源服务器 装 nginx keepalived filebeat 44机器&#xff1a; 做22 机器的备胎 装nginx keepalived 99机器&#xff1a;做mysql的主 装mysqld 装node 装filebeat 77机器&#xff1a;做mysq…

谷歌Gemini 1.5 Pro国内怎么用?国内镜像来了

长期以来&#xff0c;许多人向我咨询是否存在一个稳定而高效的全球AI大模型测试平台&#xff0c;这个平台需要不仅真实可靠&#xff0c;而且能够提供稳定和快速的服务&#xff0c;不会频繁出现故障或响应缓慢的问题。然而&#xff0c;当我发现了AskManyAI时&#xff0c;我被其所…

蛋白质治病突变的计算方法(三)

3 用于识别致病突变的特征 文献中使用了几种特征来识别蛋白质中的致病突变。它们大致分为三类&#xff1a;(1)序列&#xff0c;(2)结构和(3)网络&#xff0c;以及它们的组合。图1说明了这三组中的一些重要属性。 图1 用于识别致病突变和热点的重要特征。 基于氨基酸序列的特性…

李宏毅2022机器学习/深度学习 个人笔记(3)

本系列用于推导、记录该系列视频中本人不熟悉、或认为有价值的知识点 本篇记录代码效果不佳时应该怎么做 如下图所示&#xff1a; 接下来探讨&#xff0c;当optimization不佳的时候&#xff0c;如何判断是遇到了鞍点还是遇到了局部最小值点&#xff1f;可以通过多元函数的泰勒…

【大语言模型+Lora微调】10条对话微调Qwen-7B-Chat并进行推理 (聊天助手)

代码&#xff1a;https://github.com/QwenLM/Qwen/tree/main 国内源安装说明&#xff1a;https://modelscope.cn/models/qwen/Qwen-7B-Chat/summary 通义千问&#xff1a;https://tongyi.aliyun.com/qianwen 一、环境搭建 下载源码 git clone https://github.com/QwenLM/Qwen…