1.递归:
def inorderTraversal(self, root):
# 递归
ret = []
if not root:
return ret
self.inorderHelper(ret, root)
return ret
def inorderHelper(self, ret, root):
if not root:
return
self.inorderHelper(ret, root.left)
ret.append(root.val)
self.inorderHelper(ret, root.right)
2 .迭代
def inorderTraversal(self, root):
#迭代
res = [0]
p = [root]
while root or len(p) != 1:
while root:
p.append(root)
root = root.left
root = p[len(p) - 1]
del p[len(p) - 1]
res.append(root.val)
root = root.right
n = len(res)
return res[1 : n]
3 . Moriis
这种方法不使用递归,不使用栈,O(1)的空间复杂度完成二叉树的遍历。这种方法的基本思路就是将所有右儿子为NULL的节点的右儿子指向后继节点(对于右儿子不为空的节点,右儿子就是接下来要访问的节点)。这样,对于任意一个节点,当访问完它后,它的右儿子已经指向了下一个该访问的节点。对于最右节点,不需要进行这样的操作。注意,这样的操作是在遍历的时候完成的,完成访问节点后会把树还原。整个循环的判断条件为当前节点是否为空。
详细参考资料:http://blog.csdn.net/u012877472/article/details/49401751
def inorderTraversal(self, root):
# Moriis 方法
ret = []
if not root:
return ret
curr = root
while curr:
if not curr.left:
ret.append(curr.val)
curr = curr.right
else:
pre = curr.left
while pre.right and pre.right != curr:
pre = pre.right
if not pre.right:
pre.right = curr
curr = curr.left
else:
ret.append(curr.val)
pre.right = None
curr = curr.right
return ret