Dimple在左耳听风ARTS打卡(二十一)

2019-12-27 15:02:37 浏览数 (1)

所谓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 一篇有观点和思考的技术文章

设计模式走起来。

公众号地址: 设计模式之适配器与外观模式(一)

0 人点赞