很多朋友都问我学完基础知识以后怎样提高编程水平?当然是刷题 啦!很多小伙伴都在纠结从哪里开始,今天给大家推荐一个身边朋友都在使用的刷题网站:点击进入牛客网刷题吧!
今天是Java进阶刷题的第二天,结合经典算法学习Java语法!
👉第一题:二叉树的前序遍历
题目描述
给你二叉树的根节点 root ,返回它节点值的 前序 遍历。
示例1:
示例
输入:{1,#,2,3} 返回值:[1,2,3]
题解
import java.util.*;
public class Solution {
public void preorder(List<Integer> list, TreeNode root){
if(root == null)
return;
list.add(root.val);
preorder(list, root.left);
preorder(list, root.right);
}
public int[] preorderTraversal (TreeNode root) {
List<Integer> list = new ArrayList();
preorder(list, root);
int[] res = new int[list.size()];
for(int i = 0; i < list.size(); i++)
res[i] = list.get(i);
return res;
}
}
👉第二题:二叉树的中序遍历
题目描述
给定一个二叉树的根节点root,返回它的中序遍历结果。 进阶:空间复杂度 O(n),时间复杂度 O(n)
示例
示例1
输入:{1,2,#,#,3} 返回值:[2,3,1]
示例2
输入:{} 返回值:[]
示例3
输入:{1,2} 返回值:[2,1]
示例4
输入:{1,#,2} 返回值:[1,2]
备注: 树中节点数目在范围 [0, 100] 内 树中的节点的值在[-100,100]以内
题解
import java.util.*;
public class Solution {
public void inorder(List<Integer> list, TreeNode root){
if(root == null)
return;
inorder(list, root.left);
list.add(root.val);
inorder(list, root.right);
}
public int[] inorderTraversal (TreeNode root) {
List<Integer> list = new ArrayList();
inorder(list, root);
int[] res = new int[list.size()];
for(int i = 0; i < list.size(); i++)
res[i] = list.get(i);
return res;
}
}
👉第三题:二叉树的后序遍历
题目描述
给定一个二叉树,返回他的后序遍历的序列。
后序遍历是值按照 左节点->右节点->根节点 的顺序的遍历。
样例图:
示例
示例1
输入:{1,#,2,3} 返回值:[3,2,1] 说明:如题面图
示例2
输入:{1} 返回值:[1]
题解
import java.util.*;
public class Solution {
public void postorder(List<Integer> list, TreeNode root){
if(root == null)
return;
postorder(list, root.left);
postorder(list, root.right);
list.add(root.val);
}
public int[] postorderTraversal (TreeNode root) {
List<Integer> list = new ArrayList();
postorder(list, root);
int[] res = new int[list.size()];
for(int i = 0; i < list.size(); i++)
res[i] = list.get(i);
return res;
}
}
👉第四题:求二叉树的层序遍历
描述 给定一个二叉树,返回该二叉树层序遍历的结果,(从左到右,一层一层地遍历) 例如: 给定的二叉树是{3,9,20,#,#,15,7},
该二叉树层序遍历的结果是 [ [3], [9,20], [15,7] ]
提示: 0 <= 二叉树的结点数 <= 1500
示例
示例1
输入:{1,2} 返回值:[[1],[2]]
示例2
输入:{1,2,3,4,#,#,5} 返回值:[[1],[2,3],[4,5]]
题解
class Solution {
public:
void f(TreeNode* root,int level,vector<vector<int>> &res){
if(!root)return ;
if(level>=res.size()){
res.push_back(vector<int> {});
}
res[level].push_back(root->val);
f(root->left,level+1,res);
f(root->right,level+1,res);
}
vector<vector<int> > levelOrder(TreeNode* root) {
vector<vector<int>> res;
f(root,0,res);
return res;
}
};
👉第五题:二叉树的最大深度
题目描述
求给定二叉树的最大深度,
深度是指树的根节点到任一叶子节点路径上节点的数量。
最大深度是所有叶子节点的深度的最大值。(注:叶子节点是指没有子节点的节点。)
要求: 空间复杂度 O(1),时间复杂度 O(n)
示例1
输入:{1,2} 返回值:2
示例2
输入:{1,2,3,4,#,#,5} 返回值:3
题解
import java.util.*;
public class Solution {
public int maxDepth (TreeNode root) {
if(root == null)
return 0;
return Math.max(maxDepth(root.left), maxDepth(root.right)) + 1;
}
}
总结,刷题经验分享
📩Java基础学习主要以练习为主,很多朋友听完视频课程学会基础以后感觉对练手项目无从下手,这里推荐去牛客网看看,这里的IT题库内容很丰富,属于国内做的很好的IT学习网站,而且是课程+刷题+面经+求职+讨论区分享。
📩从基础开始练习,知识点编排详细,题目安排合理,题目表述以指导的形式进行。整个题单覆盖了java入门的全部知识点以及全部语法,通过知识点分类逐层递进,从基础开始到最后的实践任务,都会非常详细地指导你应该使用什么函数,应该怎么输入输出。 📩牛客网还提供题解专区和讨论区会有大神提供题解思路,对新手玩家及其友好,有不清楚的语法,不理解的地方,看看别人的思路,别人的代码,也许就能豁然开朗。
|