跳到主要内容

94. 二叉树的中序遍历 [medium]

94. 二叉树的中序遍历 [medium]

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

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

示例:

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

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

通过次数186,280 | 提交次数258,731

Forth Try

2020-07-09

按照0145 postorder中的通用写法来一波,果然思路很清晰,其实就跟我最开始用isinstance(node, int)来判断是一样的道理。

class Solution(object):
def inorderTraversal(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)
stack.append(node)
stack.append(None)
if node.left:
stack.append(node.left)
else:
node = stack.pop()
rv.append(node.val)
return rv
  • 执行用时:20 ms, 在所有 Python 提交中击败了69.11%的用户
  • 内存消耗:12.7 MB, 在所有 Python 提交中击败了7.14%的用户

Thrid Try

2020-07-08

这个写法更加模拟了中序dfs递归的程序过程,一般人很难直接写出这个方法,尤其是两个while的操作,还有在初始状态中root不放在stack里,在一般stack出现的环节中很少出现。

看了题解才知道还有这解法,写出了个自己体会的版本。又看了一眼题解,发现写得比我还简单。

另外发现中序遍历的版本,其实就是二叉树的升序排列,不错不错。


class Solution(object):
def inorderTraversal(self, root):
"""
:type root: TreeNode
:rtype: List[int]
"""
stack = []
node = root
rv = []
while node or len(stack):
# print("stack", stack, "rv", rv)
while node.left:
stack.append(node)
node = node.left
rv.append(node.val)
while len(stack) and not node.right:
node = stack.pop()
rv.append(node.val)
node = node.right
return rv

  • 执行用时:20 ms, 在所有 Python 提交中击败了69.12%的用户
  • 内存消耗:12.6 MB, 在所有 Python 提交中击败了7.14%的用户
  • 参考题解更简略的版本
class Solution(object):
def inorderTraversal(self, root):
"""
:type root: TreeNode
:rtype: List[int]
"""
stack = []
node = root
rv = []
while node or len(stack):
while node:
stack.append(node)
node = node.left
node = stack.pop()
rv.append(node.val)
node = node.right
return rv
  • 执行用时:20 ms, 在所有 Python 提交中击败了69.12%的用户
  • 内存消耗:12.8 MB, 在所有 Python 提交中击败了7.14%的用户

Second Try

2020-07-08

  • 跟递归次差不多的写法,但是root得抽离出来才行,不然反复的把left/right node放进去了
  • 其次本来先把root的left和right拿出来,然后把root.left和root.right都设置为None, 但是破坏了节点本身,太低级
  • 所以最后直接把value放进去,但是拿出来的时候要判断一些
  • 这种情况遇到强类型语言就有点难办,毕竟stack本身是存储node的,怎么能变成存储int呢

class Solution(object):
def inorderTraversal(self, root):
"""
:type root: TreeNode
:rtype: List[int]
"""
seq = []
stack = [root]
while len(stack):
"""

"""
root = stack.pop()
if root and isinstance(root, TreeNode):
stack.append(root.right)
stack.append(root.val)
stack.append(root.left)
# stack.append(root.right)
# stack.append(root)
# stack.append(root.left)
if root and isinstance(root, int):
seq.append(root)
return seq
  • 执行用时:24 ms, 在所有 Python 提交中击败了42.21%的用户
  • 内存消耗:12.8 MB, 在所有 Python 提交中击败了7.14%的用户

First Try

2020-07-08

终于了解了什么是中序遍历,其实就是把一棵树垂直投影,从左到右排列出来就是了。对于每个分支,都按照 node.left -> node -> node.right打印出来。

本来看题目的示例,完全看不出来是怎么排出来的。既然已经知道了含义,那么深度递归法就很方便了。先处理左边,再中间,然后右边。


class Solution(object):
def inorderTraversal(self, root):
"""
:type root: TreeNode
:rtype: List[int]
"""
seq = []
def idfs(root):
if root:
idfs(root.left)
seq.append(root.val)
idfs(root.right)
idfs(root)
return seq

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