目录
每周至少写一道算法题,阅读并点评至少一篇英文文章,学习至少一个技术技巧,分享一篇有观点和思考的技术文章。本周学习了二叉树的一些知识,主要选择做了一些经典的二叉树的习题(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教程)
文章挺适合初学者,没有太多复杂的知识,只要一步步跟着来就能快速学会一个大体的纲要,对于初学者掌握大局观有一定的帮助。
技术类文章翻译规范
为了提升自己的翻译水平去查询的一些资料,下面这几篇看下来很有启发,开始注意自己在翻译时的小细节,例如哪些该翻译,哪些不需要,还有中英文空格标点符号问题,以及陈述句,被动语句的问题,翻译的时候应该要注重不仅仅只是讲文章意思翻译到位,也要注意在翻译过程中更加贴合中文的使用习惯,需要在不断尝试摸索中成长进步。
参考:
Share
Redis 源码
学习 Redis 的时候发现的文章,是介绍 Redis 源码的,里面介绍了 Redis 字符串、列表、跳表等,采用图文的形式,介绍的很详细具体,很值得学习。
原文:Redis 源码学习系列
0 条评论