题意:Given a binary tree, return the inorder traversal of its nodes’ values.
For example:
Given binary tree [1,null,2,3],
1
\
2
/
3
return [1,3,2].
思路:二叉树的中序遍历有递归和不递归两种方法,这两种方法都需要用到O(n)的时间和空间复杂度,当然还有一种方法:Morris Traversal方法遍历二叉树,这个方法需要稍多的时间复杂度,但是只需要O(1)的空间复杂度,先介绍一下普通方法。
参考代码:
递归方式:
def inorderTraversal1(self, root):
res = []
self.helper(root, res)
return res
def helper(self, root, res):
if root:
self.helper(root.left, res)
res.append(root.val)
self.helper(root.right, res)
栈的方式:
def inorderTraversal(self, root):
res, stack = [], []
while 1:
while root:
stack.append(root)
root = root.left
if not stack:
return res
node = stack.pop()
res.append(node.val)
root = node.right
接下来就是Morris Traversal方法,这个方法的关键是找到对应节点的中序前驱结点,也就是该节点左子树的最右结点,让它指向该节点,这是用添加指针的方式代替了栈,具体做法可以看Morris Traversal。
def inorderTraversal(self, root):
"""
:type root: TreeNode
:rtype: List[int]
"""
result, curr = [], root
while curr:
if curr.left is None:
result.append(curr.val)
curr = curr.right
else:
node = curr.left
while node.right and node.right != curr:
node = node.right
if node.right is None:
node.right = curr
curr = curr.left
else:
result.append(curr.val)
node.right = None
curr = curr.right
return result