二叉树的先序, 中序, 后序遍历 都是属于深度优先遍历。
直接上代码:
先序遍历:
class TreeNode: def __init__(self, val): self.val = val self.left, self.right = None, None class Solution: """ @param root: A Tree @return: Preorder in ArrayList which contains node values. """ def preorderTraversal(self, root): # write your code here self.results = [] self.traverse(root) return self.results def traverse(self, root): if root is None: return self.results.append(root.val) self.traverse(root.left) self.traverse(root.right) # 非递归版本 class Solution1: def preorderTraversal(self, root): if root is None: return [] stack = [root] preorder = [] while stack: node = stack.pop() preorder.append(node.val) if node.right: # 先放入右子树 stack.append(node.right) if node.left: # 再放入左子树, 这样能保证左子树先被弹出 stack.append(node.left) return preorder
中序遍历:
# Definition of TreeNode: class TreeNode: def __init__(self, val): self.val = val self.left, self.right = None, None class Solution: """ @param root: A Tree @return: Inorder in ArrayList which contains node values. """ def inorderTraversal(self, root): # write your code here self.results = [] self.traverse(root) return self.results def traverse(self, root): if root is None: return self.traverse(root.left) self.results.append(root.val) self.traverse(root.right) # 添加所有最左边节点到栈。 # pop stack 然后添加到结果。 # 查找当前node的右边节点是否为空, 如果不为空,重复step 1。 class Solution: def inorderTraversal(self, root): if root is None: return [] stack = [] inorder = [] while root: stack.append(root) root = root.left while stack: node = stack.pop() inorder.append(node.val) if node.right: node = node.right while node: stack.append(node) node = node.left return inorder
后序遍历:
# Definition of TreeNode: class TreeNode: def __init__(self, val): self.val = val self.left, self.right = None, None class Solution: """ @param root: A Tree @return: Preorder in ArrayList which contains node values. """ def preorderTraversal(self, root): # write your code here self.results = [] self.traverse(root) return self.results def traverse(self, root): if root is None: return self.traverse(root.left) self.traverse(root.right) self.results.append(root.val) # 二叉树的非递归后序遍历 # # 在实现遍历的循环中维持一种不变的关系: # # 栈中结点序列的左边是二叉树已遍历过的部分,右边是尚未遍历的部分 # 如果curNode不空,其父结点就是栈顶结点 # curNode空时,栈顶就是应访问的结点 # 根据被访问结点是其父结点的左子结点或右子结点,就可以决定下一步怎么做: # 如果是左子结点就转到右兄弟;如果是右子结点,就应该处理根结点并强制退栈 class Solution: """ @param root: A Tree @return: Postorder in ArrayList which contains node values. """ def postorderTraversal(self, root): # write your code here if root is None: return [] stack = [] postorder = [] while stack or root: while root: stack.append(root) root = root.left if root.left else root.right root = stack.pop() postorder.append(root.val) if stack and stack[-1].left == root: root = stack[-1].right else: root = None return postorder