所谓ARTS:每周至少做一个LeetCode的算法题;阅读并点评至少一篇英文技术文章;学习至少一个技术技巧;分享一篇有观点和思考的技术文章。(也就是Algorithm、Review、Tip、Share 简称ARTS)这是第二十一期打卡。
算法题在死磕二叉树相关,估摸着还得再做几题才能懂其中的门道,得持续努力。
Algorithm LeetCode算法
二叉树中的中序遍历
(https://leetcode-cn.com/problems/binary-tree-inorder-traversal/
)
题目描述:给定一个二叉树,返回它的中序遍历
示例:
代码语言:javascript复制输入: [1,null,2,3]
1
2
/
3
输出: [1,3,2]
方法一:其实做了这么多次的二叉树,很多套路都已经知道的差不多了吧。比如,实在是想不出来用什么方式来解决,那就用递归吧,是个很好的解决方式。在这里,我就直接给代码了。
之前也没讲过遍历思想,那我在这里简单的用文字描述下。
- 前序遍历:根结点 -> 左子树 -> 右子树
- 中序遍历:左子树 -> 根结点 -> 右子树
- 后序遍历:右子树 -> 根结点 -> 左子树
- 层次遍历:只需按层次遍历即可
所以,所谓前序、中序、后序都是根据根结点来描述的,对应的根结点位置分别是前、中、后即可。
代码语言:javascript复制public static void main(String[] args) {
TreeNode treeNode = new TreeNode(1);
treeNode.right = new TreeNode(2);
treeNode.right.left = new TreeNode(3);
List<Integer> result = inorderTraversal(treeNode);
System.out.println(result);
}
public static List<Integer> inorderTraversal(TreeNode root) {
List<Integer> list = new ArrayList<>();
sort(root,list);
return list;
}
public static void sort(TreeNode root,List<Integer> list) {
if (root != null) {
if (root.left != null) {
sort(root.left,list);
}
list.add(root.val);
if (root.right != null) {
sort(root.right,list);
}
}
}
方法二:基于栈的遍历
前几次学习二叉树,也聊到过递归只是其中的方式之一,还有一种很常见的方式,就是采用栈的方式,我们通过入栈、出栈的办法,也能很好的把二叉树给解出来。
那当前这个,通过栈的方式如下:
代码语言:javascript复制public static List<Integer> inorderTraversal1(TreeNode root) {
List<Integer> list = new ArrayList<>();
Stack<TreeNode> stack = new Stack<>();
TreeNode treeNode = root;
while (treeNode != null || !stack.isEmpty()) {
while (treeNode != null) {
stack.push(treeNode);
treeNode = treeNode.left;
}
treeNode = stack.pop();
list.add(treeNode.val);
treeNode = treeNode.right;
}
return list;
}
你以为你知道这两个方法已经很厉害了是么,很遗憾,我在看官方解答的时候,竟然还有第三种方法,叫莫里斯遍历,惊了个呆。这里就不做赘述了,详情访问如下地址,也可以阅读原文直达。
https://leetcode-cn.com/problems/binary-tree-inorder-traversal/solution/er-cha-shu-de-zhong-xu-bian-li-by-leetcode/
Review 阅读并点评至少一篇英文文章
How to Use SQLite in Your Ionic App
(https://medium.com/better-programming/how-to-use-sqlite-in-your-ionic-app-ef441f4933ca
)
这篇文章不是作者的感悟,就是纯粹的描述了“将古腾堡项目的开源书籍转变为应用程序”,这个应用程序还运用了SQLite的方式,因为要存储许多本地的数据。正如作者自己说的,“我们的应用程序是一本书,它只需要一个简单的本机功能,SQLite数据库访问。”
这篇笔记,记录了作者的需求分析,以及对SQLite的实际操作过程,我们可以理解成是对平时工作的是一个总结。
每个优秀的程序员,都需要对自己做过的项目有更多的了解,包括从需求分析到项目成形,所以记录是一个很好的方式之一。我们现在能看到无论是在博客、公众号、论坛都能看到很多学习成果,这就是我们学习的价值,也是我们提升经验的宝贵财富。
就如我上一篇文章《不是所有时间积累下来的,都叫经验》所总结的,我们不能因为花上时间,就表示有了一定时间的工作经验。更多的,还是要通过我们自身的努力,看到了什么,学到了什么,积累了多少有效的经验,以后能用在哪些地方。
所以,我们的国外友人也是如此。程序真的是无国界的地方,我们有我们记录的方式,他们也有他们的记录方式,顺带学习下人家是如何做总结的,感觉蛮好的。有条件的朋友,可以看看原文噢。
Tip 一个技术技巧
经常会用到全文搜索这样的应用,Linux提供里一个grep工具,可以满足日常的全文搜索需求。
代码语言:javascript复制# 需要搜索一下是否包含link字段,可以使用
grep link date
# 此时会返回所有包含的行内容
# 我想获取每一行的行号
grep -n link date
# 只想拿到关键字不需要行的全部内容
grep -o link date
使用管道搜索进程
代码语言:javascript复制# 显示所有进程
ps -ef
# 只显示符合搜索条件的进程
ps -ef | grep mysql
Share 一篇有观点和思考的技术文章
设计模式走起来。
公众号地址: 设计模式之适配器与外观模式(一)