Skip to main content

144. 二叉树的前序遍历 [medium]

144. 二叉树的前序遍历 [medium]

https://leetcode-cn.com/problems/binary-tree-preorder-traversal/

给定一个二叉树,返回它的 前序 遍历。

示例:

输入: [1,null,2,3]  
1
\
2
/
3

输出: [1,2,3]
  • 进阶: 递归算法很简单,你可以通过迭代算法完成吗?

通过次数127,391 | 提交次数193,081

Third Try

2020-07-09

按照0145后序遍历中的通用写法来一波,虽然比second try中的原生写法繁琐来一些,但是思路依然清晰,跟inorder, postorder也一脉相连,非常套路化。

class Solution(object):
def preorderTraversal(self, root):
"""
:type root: TreeNode
:rtype: List[int]
"""
if not root:
return []
stack = [root]
rv = []
while len(stack):
node = stack.pop()
if node:
if node.right:
stack.append(node.right)
if node.left:
stack.append(node.left)
stack.append(node)
stack.append(None)
else:
node = stack.pop()
rv.append(node.val)
return rv
  • 执行用时:20 ms, 在所有 Python 提交中击败了69.09%的用户
  • 内存消耗:12.6 MB, 在所有 Python 提交中击败了5.56%的用户

Second Try

2020-07-08

把递归显式的用stack来出来,不知道算不算式进阶版的迭代算法?

看了题解,这确实就是进阶版的迭代算法了,只是觉得这个应该是easy等级吧,标注medium总觉得没那么简单的样子。

class Solution(object):
def preorderTraversal(self, root):
"""
:type root: TreeNode
:rtype: List[int]
"""
stack = [root]
seq = []
while len(stack):
node = stack.pop()
if node:
seq.append(node.val)
stack.append(node.right)
stack.append(node.left)
return seq

  • 执行用时:20 ms, 在所有 Python 提交中击败了69.11%的用户
  • 内存消耗:12.8 MB, 在所有 Python 提交中击败了5.56%的用户

看题解,前序,中序和后续原来是这些差别,中序和后序都是我没接触过的,而这些都是入门基础算法。。

而且前序除了dfs递归和迭代方法,竟然还有个莫里斯遍历方法,但是太绕了,不想浪费时间看下去了。

image

官方题解: https://leetcode-cn.com/problems/binary-tree-preorder-traversal/solution/er-cha-shu-de-qian-xu-bian-li-by-leetcode/

First Try

2020-07-08

dfs深度递归显然就是所谓的前序遍历。


# Definition for a binary tree node.
# class TreeNode(object):
# def __init__(self, x):
# self.val = x
# self.left = None
# self.right = None

class Solution(object):
def preorderTraversal(self, root):
"""
:type root: TreeNode
:rtype: List[int]
"""

seq = []

def dfs(root):
if root:
seq.append(root.val)
dfs(root.left)
dfs(root.right)

dfs(root)
return seq


  • 执行用时:20 ms, 在所有 Python 提交中击败了69.11%的用户
  • 内存消耗:12.7 MB, 在所有 Python 提交中击败了5.56%的用户