题目连结:144. Binary Tree Preorder Traversal
题目主题:Stack, Tree, Depth-First Search, Binary Tree
前一篇提到了Heap是一个Tree的结构,这次开始正式进入Tree的世界。今天要分享如何想像 Tree 的样子,学习如何读这颗树的资料。而接下来的三个题目我们是用 Depth-First Search 深度优先的方式来解题。
接下来会有很多题目会看到像下图这样的注解:
这是在说明一个树的节点长什麽样子,称它TreeNode,每个节点会有三个属性。
以下是一个范例,可以这样想像:
上图中,黑色的方框是一个TreeNode,可以看到他实际的val是5,左边红色方框是 left 子层左节点(TreeNode),右边绿色方框是 right 子层右节点(TreeNode)。再以红色方框的TreeNode为例,这是一个没有子层右节点的TreeNode,这样的状况是有可能的。当然这只是一个范例,实际上一棵树可能长的更大,最下层的 2 这个子节点下面可能还有一个left节点跟right节点这样长下去。
另外要提的是,接下来给的题目,都会给这样的范例,如下图:
所以在这边也要先分享,如何将一个阵列看成一棵树?拿昨天的范例当例子。
实际上这棵树转成阵列以後,会长这个样子:
tree = [1, 4, 6, 14, 13, 11, 16]
那如果没有这个图,只有阵列时,应该要怎麽看呢?
如上图,每一层有多少数量就是用 2 的次方来看。
第一层是 2 的 0 次方,只有一个,而这个就是树的根节点。
第二层是 2 的 1 次方是2,所以有两个元素,分别是根节点的子层左节点及子层右节点。
第三层是 2 的 2 次方总共有四个,从左边排到右边,14、13 就是 4 的子节点,11、16就是6的子节点。
假设这棵树继续长第四层,就会是 2 的 3 次方,总共会有8个节点,依此类推。
最後再看一次对应图。
在DFS(Depth-First Search)中Traversal分成三种方式:
今天会用到的就是Preorder Traversal。
Preorder的原则就是,进入一个节点时,马上读取它的值,假设资料是 tree = [5, 2, 6, 1, 3, null, 8]
上图中,每个节点上面的数字是读的顺序,而红色虚线箭头就是读的方向。
Preorder排出来就会是 [5, 2, 1, 3, 6, 8]。
建议可以看看LeetCode原本的题目说明,这边是用我的方式说明题目,参考就好。
今天的题目,目标就是用Preorder的方式来读取树,依照Preorder的顺序将节点的值排到一个列表中,最後回传这个列表。
约束:
范例1
输入: root = [1,null,2,3]
输出: [1,2,3]
范例2
输入: root = []
输出: []
范例3
输入: root = [1]
输出: [1]
范例4
输入: root = [1,2]
输出: [1,2]
范例5
输入: root = [1, null, 2]
输出: [1,2]
建议到这边先停下来,尝试自己解解看,若没有想法可再继续走下去。
范例:tree = [5, 2, 6, null, 8]
下图中是实际上Traversal在走的过程,实际在想像移动过程的时候,建议在最下面的节点都补虚线的节点代表走到底了。
若因为没想法而走到这边,建议看完想像以後再给自己一次机会试一次。
class Solution:
# root 要进入的节点
# preorder_list 最终要回传的list
def traversal(self, root: TreeNode, preorder_list: List[int]):
# 没有节点往回走
if root == None: return preorder_list
# 进入节点纪录目前的值
preorder_list.append(root.val)
# 前往左边子节点
preorder_list = self.traversal(root.left, preorder_list)
# 前往右边子节点
preorder_list = self.traversal(root.right, preorder_list)
return preorder_list
def preorderTraversal(self, root: Optional[TreeNode]) -> List[int]:
return self.traversal(root, [])
若内容有什麽问题或建议欢迎一起交流:)
感谢您今天愿意花时间看完这篇文章~~~~
Next:94. Binary Tree Inorder Traversal
<<: Flutter体验 Day 16-滚动组件-Sliver
康乐胚芽意面 地点:台南市新营区康乐街44号 时间:8:00~20:00 这是一家隐藏在巷弄中的店 ...
一、前言 上一篇文章提到了网页如何检测无障碍规范,但很多事情防范胜於未然,可以注意一下基本无障碍...
先前我们介绍过了阶层式状态,让我们能将一个状态向下描述得更精确,比如以之前的 input 元件状态机...
阵列名称就是阵列第一个元素的记忆体位置,同理函数名称也是程序码在记忆体的第一个位置,既然有了记忆体位...
前面在介绍Git Repo的时候有上传了几个C#的Project,里面只有几行简单的程序,是为了接下...