每周至少写一道算法题,阅读并点评至少一篇英文文章,学习至少一个技术技巧,分享一篇有观点和思考的技术文章。本周学习了二叉树的一些知识,主要选择做了一些经典的二叉树的习题(102、105 和 106),英文文章是关于谷歌公司对待 AI 的一些看法,之后的 Tip 是在翻译过程中寻找的提高翻译水平的一些技巧和注意事项,希望能提高自己的翻译水平,最后的分享的是 Redis 的源码分析,其中用到了很多数据结构和一些十分有用的设计思想,十分值得学习。

Algorithm

本周做了一些二叉树相关的题目。

102. Binary Tree Level Order Traversal

二叉树的层次遍历,主要思路就是将节点放在队列中进行树的宽度优先搜索,每次都将队列中的节点全部取出,将每个节点的左子节点和右子节点放进去,重复上面的操作就能得到层次遍历。

class TreeNode:
    def __init__(self, x):
        self.val = x
        self.left = None
        self.right = None


class Solution:
    def levelOrder(self, root: TreeNode) -> List[List[int]]:
          # 记录节点的队列
        node_list = [root]
        # 记录答案
        ans = list()
        if root is None:
            return []
        while node_list:
            current_node_list = list()
            current_ans = list()
            # 每次都将队列中的全部元素取出来
            while node_list:
                current_node = node_list.pop(0)
                current_ans.append(current_node.val)
                # 判断是否存在左右子节点,按左到右的顺序添加到数组中
                if current_node.left:
                    current_node_list.append(current_node.left)
                if current_node.right:
                    current_node_list.append(current_node.right)
            ans.append(current_ans)
            # 之后再将其中的元素有子节点的全部按顺序放进去
            node_list.extend(current_node_list)
        return ans

在放回子节点的时候注意要按取出来的节点的从左到右的顺序放,而且取出节点的时候要注意是使用先进先出队列,每次都要取出头节点,这样就能保证层次遍历的时候顺序。

105. Construct Binary Tree from Preorder and Inorder Traversal

已知先序遍历和中序遍历,求该二叉树。

依据先序遍历的特点,第一个元素,假设为 x,则这个 x 一定是该二叉树的根节点,之后根据中序遍历的特点,在中序遍历中的该元素 x 的左半部分的元素则是该 x 节点的全部左半节点,右边部分就是全部右半节点。

利用这一特点,就可以很简单的写出递归的方式:

class TreeNode:
    def __init__(self, x):
        self.val = x
        self.left = None
        self.right = None


class Solution:
    def buildTree(self, preorder: List[int], inorder: List[int]) -> TreeNode:
        if not preorder:
            return None
        root_val = preorder[0]
        root = TreeNode(root_val)
        # 求出中序遍历中的位置
        index = inorder.index(root_val)
        # 如果求出来的位置在第一个,则便是当前节点没有左子节点
        if index != 0:
            root.left = self.buildTree(preorder[1:index+1], inorder[:index])
        # 如果位置在最后一个,则便是没有右子节点
        if index != len(inorder)-1:
            root.right = self.buildTree(preorder[index+1:], inorder[index+1:])
        return root

在分割先序遍历和中序遍历的数组的时候,需要注意要丢去当前的节点元素,也就是对应的地方要记得数组下标加一的操作。

106. Construct Binary Tree from Inorder and Postorder Traversal

与上一题类似,还可以根据后序遍历和中序遍历求出二叉树。

class TreeNode:
    def __init__(self, x):
        self.val = x
        self.left = None
        self.right = None


class Solution:
    def buildTree(self, inorder: List[int], postorder: List[int]) -> TreeNode:
          if not postorder:
            return None
        root_val = postorder[-1]
        root = TreeNode(root_val)
        # 找到中序遍历中的位置
        index = inorder.index(root_val)
        if index != 0:
            root.left = self.buildTree(inorder[:index], postorder[0:index])
        if index != len(inorder)-1:
            root.right = self.buildTree(inorder[index+1:], postorder[index: -1])
        return root

后序遍历与先序遍历刚好相反,后序遍历中,根节点的位置在最后一个,其余的类似,判断中序遍历中根节点的位置,分割中序遍历和后序遍历,递归求出答案。

Review

谷歌 AI 原则,Google CEO 孙达尔·皮柴(Sundar Pichai)写的一篇文章,讲述了 Google 公司在 AI 方面的一些基本原则,其中包括 Google 公司对待人工智能的七个原则,以及表明在哪些领域不会使用人工智能,最后还写了公司所坚信的事和所作出的决策。

翻译:文章翻译 | 谷歌 AI 原则 | AI at Google: our principles

Tip

微软 Python 教程

微软公开的 Python 教程,适合使用 Windows 的 Python 初学者观看,主要以教程为主,在 Windows 上用 Microsoft 提供的工具一步步搭建 Python 环境,以及进行一些 Web 的搭建和人工智能相关的学习。

微软python教程截图

(截图来源:微软Python教程

文章挺适合初学者,没有太多复杂的知识,只要一步步跟着来就能快速学会一个大体的纲要,对于初学者掌握大局观有一定的帮助。

技术类文章翻译规范

为了提升自己的翻译水平去查询的一些资料,下面这几篇看下来很有启发,开始注意自己在翻译时的小细节,例如哪些该翻译,哪些不需要,还有中英文空格标点符号问题,以及陈述句,被动语句的问题,翻译的时候应该要注重不仅仅只是讲文章意思翻译到位,也要注意在翻译过程中更加贴合中文的使用习惯,需要在不断尝试摸索中成长进步。

参考:

Share

Redis 源码

学习 Redis 的时候发现的文章,是介绍 Redis 源码的,里面介绍了 Redis 字符串、列表、跳表等,采用图文的形式,介绍的很详细具体,很值得学习。

原文:Redis 源码学习系列

分类: 生活

0 条评论

发表回复

您的电子邮箱地址不会被公开。