11.23二叉树

news/2024/5/4 17:10:58/文章来源:https://blog.csdn.net/m0_72618437/article/details/128010114

目录

一.笔试强训习题订正

1.选择题

2.编程题-组队竞赛

3.删除公共字符

解法1 哈希映射思想

解法2 暴力解法

解法3 substring解法+replaceAll()

二.二叉树相关Oj题

1.二叉树的遍历

2.二叉树分层遍历

三.二叉树的最近公共祖先

1.思路一

2.思路2

四.将二叉搜索树转化为有序链表


一.笔试强训习题订正

1.选择题

向上取整

2.编程题-组队竞赛

这道题的题眼就是水平值是第二稿水平值 也就是123 是2

并且几组就是水平置相加

这道题的思路就是先读取输入的组成的队伍

然后读取每一个元素.放入数组里

因为参加比赛的一定是3*n个选手,所以一定是数组的长度一定是

3*n

所以也好初始化数组

然后给数组排序

我们的解题思路就是每次从数组的第一个元素和最后两个取两个元素作为一组,这样就能保证每个水平最大值

要注意输入输出

先排序

假设排序后是: 1 2 3 4 5 6 7 8 9

1 和 8 9 为一组

2 和 6 7 为一组

3 和 4 5为一组

每组第二大的数字为 8 6 4

其 size=9 ;  

import java.util.*;
public  class Main{public static void main(String[] args){Scanner sc=new Scanner(System.in);while(sc.hasNextInt()){int n=sc.nextInt();long sum=0;int[] array=new int[3*n];for(int i=0;i<3*n;i++){array[i]=sc.nextInt();}Arrays.sort(array);//数组排序for(int i=1;i<=n;i++){sum+=array[3*n-i*2];}System.out.println(sum);}}
}

这道题 刚开始我害怕可能任务这是一组队列题,其实这里看到分组就要往数组靠.

还有第二行多组输入的时候不需要处理循环,就直接用一个for循环来处理每一个来接收,

还有复习到了一个数组排序公式

Arrays.sort(数组名);

3.删除公共字符

解法1 哈希映射思想

先遍历第二个字符串,因为一个哈希数组初始都为0

就先把遍历到的字符在哈希表找到对应的位置置为1

然后遍历字符串1.每遍历一个不是1的就打印\

import java.util.Scanner;
public class Main{public static void main(String[] args){Scanner sc=new Scanner(System.in);String str1=sc.nextLine();String str2=sc.nextLine();char[] hash=new char[256];for(int i=0;i<str2.length();i++){hash[str2.charAt(i)]++;}for(int i=0;i<str1.length();i++){if(hash[str1.charAt(i)]==0){System.out.print(str1.charAt(i));}}}
}

解法2 暴力解法

遍历字符串1,

每遍历一个元素就开始遍历字符串2有没有相同元素,如果有,就不打印.结束循环就打印.

import java.util.Scanner;
public class Main{public static void main(String[] args){Scanner sc=new Scanner(System.in);String str1=sc.nextLine();String str2=sc.nextLine();for(int i =0;i<str1.length();i++){char ch=str1.charAt(i);int a=0;for(int j=0;j<str2.length();j++){if(ch==str2.charAt(j)){a=1;break;}}if(a==0){System.out.print(ch);}}}
}

解法3 substring解法+replaceAll()

这种方法要对string的各种方法熟稔于心

import java.util.Scanner;
public class Main{public static void main(String[] args){Scanner sc=new Scanner(System.in);String str1=sc.nextLine();String str2=sc.nextLine();for(int j=0;j<str2.length();j++){str1=str1.replaceAll(str2.substring(j,j+1),"");}System.out.println(str1);}
}

遍历字符串2.从第一个元素开始,如果有相同的就替换为""也就是没有

二.二叉树相关Oj题

1.二叉树的遍历

import java.util.*;
class TreeNode {TreeNode left;TreeNode right;char  val;TreeNode(char val) {this.val = val;}
}// 注意类名必须为 Main, 不要有任何 package xxx 信息
public class Main {public static void inorder(TreeNode root) {if (root == null) return;inorder(root.left);System.out.print(root.val + " ");inorder(root.right);}public static void main(String[] args) {Scanner in = new Scanner(System.in);// 注意 hasNext 和 hasNextLine 的区别while (in.hasNextLine()) { // 注意 while 处理多个 caseString str = in.nextLine();TreeNode root = creat(str);inorder(root);System.out.println();}}public static int i = 0;public static TreeNode creat(String ret) {TreeNode root =null;if (ret.charAt(i) != '#') {root=new TreeNode(ret.charAt(i));i++;root.left = creat(ret);root.right = creat(ret);} else {i++;}return root;}}

这里我出现了一些问题

在创建二叉树这一步,我先入为主直接初始化根,先不说没有考虑到第一个节点就是空的,也就是这棵树就是空树.也没有考虑到假如树的分节点是空的,进入递归,直接创建了一个内容是#的树而不是返回空.逻辑出错

最好的方法就是初始化先是null.判断是否为#.是就初始化,并i++.进入left.或者就是null并i+=

往后遍历

2.二叉树分层遍历

这里我们考虑到用队列.先进先出,底层用顺序表也就是数组存放每一层

遍历树.判断是否为空,不是就是放入他的左子树和右子树.并打印他,

如果是空,就不打印

这样从左向右打印

class Solution {public List<List<Integer>> levelOrder(TreeNode root) {List<List<Integer>> lists=new ArrayList<>();if(root==null) return lists;Queue<TreeNode> queue=new LinkedList<>();queue.offer(root);while(!queue.isEmpty()){List<Integer> list=new ArrayList<>();int size=queue.size();//求队列长度没有length公式只有大小的while(size!=0){TreeNode cur=queue.poll();list.add(cur.val);if(cur.left!=null){queue.offer(cur.left);} if(cur.right!=null){queue.offer(cur.right);}size--;}lists.add(list);}return lists;}
}

注意队列的长度公式.只有里面有多少元素 的公式也就是 queue.size()

这道题怎么样分层

就是求每一次循环得到的队列长度,然后循环放入

并且每次放入顺序表里,都会弹出.这样保证上一层的空了

这种情况,遇到最后一组,会显示还有元素,就继续进入循环,但是因为是空的,所以不放元素,但是还是一组表,就会显示多一层

所以还是得分开进行判断放元素

这道题还有很多问法

1.求二叉树的左视图,其实就是链表的每组数组的第一个元素

2.求二叉树的宽度,其实就是数组最长的,

三.二叉树的最近公共祖先

1.思路一

如果给定的树是一颗二叉搜索树

根节点的左子树都比根小

根节点的右子树都比根大

根据中序遍历 : 左子树-根-右子树

我们可以思考

就按根节点来想.如果

1.p是root或者q是root

2.如果p的值和q的值都小于root.那么就说明公共祖先都在root的左树

那就说明公共祖先是在root的左树中

3.如果p的值和q的值都大于root.那么就说明公共祖先都在root的右树

那就说明公共祖先是root的右树

4.如果一个大于根节点另外一个小于根节点,就说明一个在左子树,一个在右子树

那么公共祖先就是root

那么我们可以往后递归,再对root,left和root.right进行判断递归

直到找到满足条件

那么我们再发散一下,如果他只是一颗普通的树呢

那就分别在左子树和右子树找到p或者q,如果能在左子树或者右子树找到那就返回找到的节点

但是如果左子树和右子树都找到了.那就返回根节点

如果都没有就返回null

然后再发散一下

递归根节点,传递的p和q不变

class Solution {public TreeNode lowestCommonAncestor(TreeNode root, TreeNode p, TreeNode q) {if(root==null) return null;if(p==root||q==root) return root;TreeNode curLeft=lowestCommonAncestor( root.left, p, q);TreeNode curright=lowestCommonAncestor( root.right, p, q);if(curLeft!=null&&curright==null){return curLeft;}if(curLeft==null&&curright!=null){return curright;}if(curLeft!=null&&curright!=null){return root;}return null;}
}

先判断是否是空的,再判断是否找到,如果找不到就开始往下递归.,如果一边有一边没有,就返回一边的.如果两边都有,就说明在两边就直接返回这个节点,如果两边都没有,就返回null

递归回来,

递归的思想我觉得就是先大问题,然后通过小问题判断细节,就搞定.

2.思路2

假设这颗二叉树是孩子双亲表示法表示的

因为都知道上一颗连接他的是谁,回溯过去,就跟链表求交点的题目一样的做法

先存储节点的对应的父节点回溯过去存储在相应链表里

但是这道题是孩子表示法表示,并没有双亲节点

因为栈可以依次存储,并先进后出,依次从后往前吐出来

第一步.我们可以用两个栈存储路径

第二步.求栈的大小

第三步,让栈中多的元素出差值个元素

第四步开始出栈,直到栈顶元素相同,此时就是公共祖先,

框架搭好了

但是还是有疑惑.我们如何找根节点到指定节点的路径呢

所以这里我们需要建立一个路径的方法.

这里我的思路就是先判断是否为空,返回假

然后直接把root压入栈内,

然后判断是否为相同,就直接返回真

如果都不相同.就开始找子树或者右树

如果在一个节点的右树找到,那么在他的左树所有压进去的节点都会弹出来.

并会返回false.就开始向上递归.

因为左边没有相同的额节点的时候,就会弹出,每回溯一次都会弹出一次,直到回到那个节点,

class Solution {public TreeNode lowestCommonAncestor(TreeNode root, TreeNode p, TreeNode q) {if(root==null) return null;Stack<TreeNode> s1=new Stack<>();Stack<TreeNode> s2=new Stack<>();path(root,p,s1);path(root,q,s2);int size1=s1.size();int size2=s2.size();int size=0;if(size1>size2){size=size1-size2;while(size!=0){s1.pop();size--;}}else{size=size2-size1;while(size!=0){s2.pop();size--;}}while(!s1.isEmpty()){if(s1.peek()==s2.peek()){return s1.peek();}s1.pop();s2.pop();}return null;}boolean path(TreeNode root,TreeNode p,Stack<TreeNode> s){if(root==null||p==null) return false;s.push(root);if(root==p) return true;boolean flg=path(root.left,p,s);if(flg) return true;flg=path(root.right,p,s);if(flg) return true;s.pop();return false;}

四.将二叉搜索树转化为有序链表

我的思路就是一边排序一边修改指向

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

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

相关文章

web网页大作业——基于HTML+CSS+JavaScript制作摄影之家网站

&#x1f389;精彩专栏推荐&#x1f447;&#x1f3fb;&#x1f447;&#x1f3fb;&#x1f447;&#x1f3fb; ✍️ 作者简介: 一个热爱把逻辑思维转变为代码的技术博主 &#x1f482; 作者主页: 【主页——&#x1f680;获取更多优质源码】 &#x1f393; web前端期末大作业…

java项目测试成功后部署到服务器上的相关问题

1.java项目是如何部署给用户使用的? 前提&#xff1a; 以一个web项目为例&#xff0c; 使用工具&#xff1a;开发工具&#xff1a;IDEA&#xff1b;Tomcat&#xff08;应用服务器&#xff09;&#xff1b;Navicat&#xff08;数据库&#xff09;&#xff1b;Jenkins&#xff…

鲲鹏devkit编译调试工具——《sudoku》作业解析

《sudoku》作业解析 本次实验以sudoku项目为例介绍鲲鹏编译调试插件的基本使用方法 本次实验的步骤主要为 获取源码安装鲲鹏编译调试插件服务器配置进行代码同步配置配置测试任务进行编译调试 接下来我们先获取本次实验所需要的源码 获取源码 sudoku项目已经上传到github使…

CVPR‘15 Joint action recognition and pose estimation from video

任务&#xff1a;action recognition and pose estimation 思路&#xff1a;对动作和姿态进行统一建模&#xff0c;将动作分成姿态&#xff0c;再将姿态分成part&#xff0c;学习三种level特征&#xff0c;通过动态规划有效的推断动作标签和姿态。 方法&#xff1a;统一建模…

鼠标经过图片在边框内放大动效

鼠标没有经过&#xff1a; 鼠标经过的时候&#xff0c;看图&#xff0c;应该可以看出变化吧&#xff01;图有放大的效果。 样式&#xff1a;图片由一个盒子包着&#xff0c;盒子加上overflow:hidden的样式&#xff0c;即可以保证图片在边框内放大。 然后给图片加上动画效果就可…

Vue常用知识点汇总

1. Vue常见的指令有哪些&#xff0c;有什么用 &#xff08;1&#xff09;v-text&#xff1a; 会替换掉元素里的内容&#xff1b; &#xff08;2&#xff09;v-html&#xff1a; 可以渲染html界面&#xff1b; &#xff08;3&#xff09;v-clock&#xff1a; 防止界面闪烁&…

JavaScript开发工具WebStorm入门教程:开始运行WebStorm(一)

WebStorm是一个JavaScript开发工具&#xff0c;用于JavaScript及其相关技术编码&#xff0c;包括TypeScript、React、Vue、Angular、Node.js、HTML和样式表。就像IntelliJ IDEA和其他JetBrains ide一样&#xff0c;WebStorm让您的开发体验更愉快&#xff0c;自动化日常工作&…

7种主流数据分析软件比较及经典教材推荐

前言 STATA 软件优点&#xff1a;Stata以其简单易懂和功能强大受到初学者和高级用户的普遍欢迎。使用时可以每次只输入一个命令&#xff0c;也可以通过一个Stata程序一次输入多个命令。这样的话即使发生错误&#xff0c;也较容易找出并加以修改。尽管Stata的数据管理能力没有…

用DIV+CSS技术设计我的家乡网站(web前端网页制作课作业)南宁绿城之都

家乡旅游景点网页作业制作 网页代码运用了DIV盒子的使用方法&#xff0c;如盒子的嵌套、浮动、margin、border、background等属性的使用&#xff0c;外部大盒子设定居中&#xff0c;内部左中右布局&#xff0c;下方横向浮动排列&#xff0c;大学学习的前端知识点和布局方式都有…

Xshell连接不上创建的虚拟机

1.输入ip a查看是否有对应的网卡ip 更改前&#xff1a; 更改后&#xff1a; 具体看下面博客的步骤&#xff0c;这里不详细赘述 (137条消息) Linux虚拟机联网步骤&#xff08;修改网络配置信息&#xff09;_袁梦码的博客-CSDN博客_怎么让linux虚拟机联网 2.关闭防火墙 永久关…

C语言实现冒泡排序(图解)

目录 一、冒泡排序是什么&#xff1f; 二、图解冒泡排序过程 三、代码实现 3.1易错点&#xff08;切记切记&#xff09; 四、优化 4.1优化代码 一、冒泡排序是什么&#xff1f; int arr[]{9,8,7,6,5,4,3,2,1,0} &#xff0c;像这样的数组&#xff0c;升序排序。 冒泡排序…

linux 清理垃圾文件

linux的文件系统比windows的要优秀&#xff0c;不会产生碎片&#xff0c;对于长时间运行的服务器来说尤为重要&#xff0c;而且linux系统本身也不会像windows一样产生大量的垃圾文件。不知道这个说法有没有可信度!至少我们可以确定的是linux系统的文件系统是比较优秀的! linux…

使用html+css+js实现一个静态页面(含源码)

&#x1f389;精彩专栏推荐 &#x1f4ad;文末获取联系 ✍️ 作者简介: 一个热爱把逻辑思维转变为代码的技术博主 &#x1f482; 作者主页: 【主页——&#x1f680;获取更多优质源码】 &#x1f393; web前端期末大作业&#xff1a; 【&#x1f4da;毕设项目精品实战案例 (10…

MASA Framework 事件总线 - 进程内事件总线

概述 事件总线是一种事件发布/订阅结构&#xff0c;通过发布订阅模式可以解耦不同架构层级&#xff0c;同样它也可以来解决业务之间的耦合&#xff0c;它有以下优点 松耦合横切关注点可测试性事件驱动 发布订阅模式 通过下图我们可以快速了解发布订阅模式的本质 订阅者将自…

Python学习 - 异常处理

Python学习 - 语法入门&#xff1a;https://blog.csdn.net/wanzijy/article/details/125287855 Python学习 - 数据类型&#xff1a;https://blog.csdn.net/wanzijy/article/details/125341568 Python学习 - 流程控制&#xff1a;https://blog.csdn.net/wanzijy/article/details…

什么是软件测试?

什么是软件测试&#xff1f; 软件测试的定义&#xff1a;在一定条件下对软件进行操作&#xff0c;发现软件的问题&#xff0c;提高软件的质量。 软件测试在开发中的有着重要地位。软件测试在各阶段的完成相应的任务&#xff0c;需求测试&#xff0c;架构测试&#xff0c;详细测…

关于windows的文件监控管理系统(Java)

目 录 摘 要 I Abstract II 1.绪论 1 1.1课题背景 1 1.2系统开发的目的和意义 2 1.3国内外概况 3 1.4研究主要内容 3 2.windows文件监控管理系统相关技术介绍 4 2.1 API 4 2.2 API HOOK 5 2.3 Java 5 2.4 DLL 6 2.4 Windows系统的Socket编程 6 2.4.1使用WinSock API 6 2.4.2 使…

MCE | 为什么肥胖经常被“针对”?

近年来&#xff0c;肥胖问题受到越来越多的关注&#xff0c;肥胖不只影响美丽身材&#xff0c;过度肥胖还可能导致肥胖症&#xff0c;这是很多疾病的高风险因素。所以肥胖是一种病&#xff1f;肥胖的标准是什么&#xff1f;别急&#xff0c;等小编慢慢道来。 认识肥胖症 (Obesi…

运动用品品牌排行榜,2022年值得买的运动用品推荐

如今&#xff0c;人们的生活节奏越来越快&#xff0c;工作和生活压力大。因此&#xff0c;人们越来越重视体育运动&#xff0c;通过体育运动达到放松和锻炼身体的目的&#xff0c;运动装备也就跟着火热起来。无论是进行室内或户外活动&#xff0c;选一套合适的运动装备是很有必…

顶象首届业务安全保卫战完美落幕,快来看看TOP10里有没有你!

今年双十一&#xff0c;顶象特别发起了首届业务安全保卫战&#xff0c;旨在召集白帽子们为业务安全贡献自己的一份力量。历经一个月&#xff0c;顶象首届业务安全保卫战已于20日正式落下帷幕。 截止11月20 日&#xff0c;顶象业务安全保卫战通过审核的业务安全情报&业务安…