前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >Dimple在左耳听风ARTS打卡(二十一)

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

作者头像
程序员小跃
发布2019-12-27 15:02:37
3770
发布2019-12-27 15:02:37
举报
文章被收录于专栏:程序员小跃程序员小跃

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

设计模式走起来。

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

本文参与 腾讯云自媒体分享计划,分享自微信公众号。
原始发表:2019-08-15,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 奔跑吧攻城狮 微信公众号,前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体分享计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • Algorithm LeetCode算法
  • Review 阅读并点评至少一篇英文文章
  • Tip 一个技术技巧
  • Share 一篇有观点和思考的技术文章
相关产品与服务
数据库
云数据库为企业提供了完善的关系型数据库、非关系型数据库、分析型数据库和数据库生态工具。您可以通过产品选择和组合搭建,轻松实现高可靠、高可用性、高性能等数据库需求。云数据库服务也可大幅减少您的运维工作量,更专注于业务发展,让企业一站式享受数据上云及分布式架构的技术红利!
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档