力扣练习训练2(java)——二叉树的中序遍历、对称二叉树、二叉树的最大深度、买卖股票的最佳时机

1、二叉树的中序遍历

对于二叉树的输入:

首先需要知道二叉树的前序遍历:根节点→左节点→右节点

中序遍历:左节点→根节点→右节点

后序遍历:左节点→右节点→根节点

(主要是根节点在变化)

使用递归的方法,首先新建一个列表用于存储排序后的数字,之后调用函数进行递归,之后返回列表,递归的函数(定义为void,有可能返回空/列表)需要传入节点和列表,首先判断此时传入的节点是否为空,如果为空直接返回空;之后由于是中序排序,因此先左节点、再根节点,最后右节点,左右节点再次使用递归函数,根节点则直接在列表中进行添加,同样的对于前、后序排序,只需要调整根节点的代码即可,放置位置不同效果不同。如下所示:

/**

* Definition for a binary tree node.

* public 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;

* }

* }

*/

class Solution {

public List<Integer> inorderTraversal(TreeNode root) {

List<Integer>res=new ArrayList<Integer>();

indor(root,res);

return res;

}

public void indor(TreeNode rot,List<Integer> res){

if(rot==null){

return;

}

indor(rot.left,res);

res.add(rot.val);//调整这行位置,可实现前序、中序和后序排序

indor(rot.right,res);

}

}

2、对称二叉树

解题思路:这道题需要判断二叉树是否是对称,相当于左子树是从左到右排列,而右子树则是从右到左的排序

将情况主要分为三大部分进行判断,首先在check函数中将根节点的左子树和右子树分别设置为p,q

(1)如果p和q同时为0,直接返回true,表明这个二叉树是对称的

(2)p或者q里边只要有一个不为0,就返回false,相当于一个根节点只有某一侧节点有值,很明显不对称

(3)如果p和q都不为空,但是两者的值并不相等,也返回0

最后使用递归思想,再次调用ckeck函数,将p.left和q.right进行检查,p.right和q.left进行比较,满足对称的想法

代码如下:

/**

* Definition for a binary tree node.

* public 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;

* }

* }

*/

class Solution {

public boolean isSymmetric(TreeNode root) {

return check(root.left,root.right);

}

public boolean check(TreeNode p,TreeNode q){

if(p==null && q==null){

return true;

}

if(p==null || q==null){

return false;

}

if(p.val!=q.val){

return false;

}

return check(p.left,q.right)&&check(p.right,q.left);

}

}

3、二叉树的最大深度

解题思路:这道题主要要记得一个方法,maxDepth 作用用于计算‌树结构(如二叉树或 N 叉树)的最大深度‌,即从根节点到最远叶子节点的最长路径上的节点总数。

因此这道题的主要做法就是首先判断根节点是否为空,如果为空则直接返回0

其次如果不为空,二叉树深度公式:1+取(左子树的最大深度,右子树的最大深度)的最大值,就是整个二叉树的最大深度,只要某一侧一直有数就可。

代码如下:

class Solution {

public int maxDepth(TreeNode root) {

if(root==null){return 0;}

return 1+Math.max(maxDepth(root.left),maxDepth(root.right));

}

}

4、买卖股票的最佳时机

解题思路:这道题的列表实际上记录的是每天的股票价格

如果在第x天时卖出,收获的最大利润=第x天的股票价格-前x天中某一天的最低股票价格

首先设定一个最小值(初始值先类似于无穷大),之后再设一个最大利润值(初始值为0)

使用for循环进行遍历,使用if语句,当pricei小于min时,将min更新为pricei(这一步相当于要在i天前内,先找到这组数列中的最小值)

(如果前i天的最小值)如果pricei-maxpro>maxpro时,将maxpro重新更新为pricei-maxpro

最后循环结束之后返回maxpro

代码如下:

class Solution {

public int maxProfit(int\[\] prices) {

int min=Integer.MAX_VALUE;//定义一个很大的值

int maxpro=0;

for(int i=0;i<prices.length;i++){

if(pricesi<min){

min=pricesi;

}else if(maxpro<pricesi-min){

maxpro=pricesi-min;

}

}

return maxpro;

}

}

相关推荐
yaoxin5211233 小时前
434. Java 日期时间 API - Period 基于日期的时间段
java·开发语言·python
noipp3 小时前
推荐题目:洛谷 P10907 [蓝桥杯 2024 国 B] 蚂蚁开会
c语言·c++·算法·编程·洛谷
何极光4 小时前
IDEA集成Maven
java·maven·intellij-idea
程序员二叉4 小时前
【JUC】ThreadLocal底层原理|内存泄漏|弱引用|跨线程传递方案
java·开发语言·面试·职场和发展·juc
程序员二叉4 小时前
【JUC】线程池全套深度详解|参数|流程|拒绝策略|调优|异常处理
java·开发语言·jvm·算法·面试·juc
老马识途2.04 小时前
在AI的帮助下理解spring的启动过程
java·前端·spring
青山木4 小时前
Hot 100 --- 轮转数组
java·数据结构·算法
徐小夕5 小时前
Loop Engineering 深度解析与实战指南(全网最全)
前端·算法·github
Qt程序员5 小时前
掌握 Linux 内核调度:从原理到实现(进程篇)
java·开发语言
code bean5 小时前
【LangChain】检索器完全指南:从向量检索到生产级 RAG 架构
java·开发语言·微服务