力扣练习训练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语句,当price[i]小于min时,将min更新为price[i](这一步相当于要在i天前内,先找到这组数列中的最小值)

(如果前i天的最小值)如果price[i]-maxpro>maxpro时,将maxpro重新更新为price[i]-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(prices[i]<min){

min=prices[i];

}else if(maxpro<prices[i]-min){

maxpro=prices[i]-min;

}

}

return maxpro;

}

}

相关推荐
二哈赛车手7 小时前
新人笔记---ApiFox的一些常见使用出错
java·笔记·spring
吃好睡好便好8 小时前
在Matlab中绘制横直方图
开发语言·学习·算法·matlab
栗子~~8 小时前
JAVA - 二层缓存设计(本地缓冲+redis缓冲+广播所有本地缓冲失效) demo
java·redis·缓存
YDS8298 小时前
DeepSeek RAG&MCP + Agent智能体项目 —— RAG知识库的搭建和接口实现
java·ai·springboot·agent·rag·deepseek
仰泳之鹅8 小时前
【C语言】自定义数据类型2——联合体与枚举
c语言·开发语言·算法
未若君雅裁9 小时前
MyBatis 一级缓存、二级缓存与清理机制
java·缓存·mybatis
AI人工智能+电脑小能手10 小时前
【大白话说Java面试题 第65题】【JVM篇】第25题:谈谈对 OOM 的认识
java·开发语言·jvm
阿维的博客日记10 小时前
Nacos 为什么能让配置动态生效?(涉及 @RefreshScope 注解)
java·spring
雨辰AI10 小时前
SpringBoot3 + 人大金仓读写分离 + 分库分表 + 集群高可用 全栈实战
java·数据库·mysql·政务
x_yeyue11 小时前
三角形数
笔记·算法·数论·组合数学