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;
}
}