基于官方解答的改进,Morris Traversal 且不用更改原来树的结构
Morris原文
Traversing binary trees simply and cheaply - ScienceDirect
- PreOrder 前序遍历
class Solution(object): def preorderTraversal(self, root): node, output = root, [] while node: if not node.left: output.append(node.val) node = node.right else: predecessor = node.left while predecessor.right and predecessor.right is not node: predecessor = predecessor.right if not predecessor.right: output.append(node.val) predecessor.right = node node = node.left else: predecessor.right = None node = node.right return output
- InOrder 中序遍历
class Solution(object): def inorderTraversal(self, root): node, output = root, [] while node: if not node.left: output.append(node.val) node = node.right else: predecessor = node.left while predecessor.right and predecessor.right is not node: predecessor = predecessor.right if not predecessor.right: predecessor.right = node node = node.left else: output.append(node.val) predecessor.right = None node = node.right return output
- PostOrder 后序遍历
class Solution(object): def postorderTraversal(self, root): node, output = root, [] while node: if not node.right: output.append(node.val) node = node.left else: predecessor = node.right while predecessor.left and predecessor.left is not node: predecessor = predecessor.left if not predecessor.left: output.append(node.val) predecessor.left = node node = node.right else: predecessor.left = None node = node.left list.reverse(output) return output