前言
算法的重要性不言而喻!区分度高!
现在学习的门槛低了,只有能上网每个人都可以学编程!培训班6个月就可以培养出来能干活的人,你怎么从这些人中脱颖而出?没错!就是学算法,学一些底层和基础的东西。
说的功利点是为了竞争,卷死对手。真心话说就是能提高自己的基础能力,为技术可持续发展做好充分的准备!!!
提前入门学习书籍:CPrimerPlus、大话数据结构
刷题网站
我是按照代码随想录提供的刷题顺序进行刷题的,大家也可以去刷leetcode最热200道,都可以
刷题嘛,最重要的就是坚持了!!!
画图软件
OneNote
这个要经常用,遇见不懂的流程的话就拿它画一画!
笔记软件
Typoral
题目
解析
遍历三部曲
还是熟悉的递归三部曲,每次遍历我们都要用到它,我们再写一遍
- 确定递归函数的参数和返回值
- 确定终止条件
- 确定单层递归的逻辑 没错,又是它们三个,但凡涉及到遍历的,都离不开这三步。
什么是中序遍历呢?
如下图二叉树,前序遍历的顺序如下
中序遍历就是先遍历左节点,然后中间节点最后是右节点
二叉树的定义
再来回顾一下二叉树的定义
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; } }
递归第一步:确定递归的参数和返回值
参数是一个根节点,一个list集合(用来存放结果)
public void preorder(TreeNode root, List<Integer> result) {
确定终止条件
什么时候遍历停下来了呢?
那就是当前遍历的节点为空,那就终止遍历
确定单层递归的逻辑
中序遍历当然是这样了,其实就是和前序遍历的顺序翻一翻即可
preorder(root.left, result); result.add(root.val); preorder(root.right, result);
完整代码如下:
其实就是对前序遍历顺序进行了微调
就是对前序代码的遍历部分进行调整,得到的结果就是中序遍历的结果了
class Solution { public List<Integer> preorderTraversal(TreeNode root) { List<Integer> result = new ArrayList<Integer>(); preorder(root, result); return result; } public void preorder(TreeNode root, List<Integer> result) { if (root == null) { return; } preorder(root.left, result); result.add(root.val); preorder(root.right, result); } }
leetcode测试
我们在测试的时候,最好是在leetcode里写,因为如果有面试的时候也是手写,那也是没有代码提示的,相当与自己从0开始写的,所以我们在平常的练习中也要这样写练习