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;

}

}

Logo

汇聚全球AI编程工具,助力开发者即刻编程。

更多推荐