深度遍历
递归版本
class TreeNode : def __init__ ( self, val= 0 , left= None , right= None ) : self. val = valself. left = leftself. right = rightclass Solution : def preorderTraversal ( self, root: TreeNode) - > list [ int ] : if not root: return [ ] left = self. preorderTraversal( root. left) right = self. preorderTraversal( root. right) return [ root. val] + left + rightdef inorderTraversal ( self, root: TreeNode) - > list [ int ] : if not root: return [ ] left = self. preorderTraversal( root. left) right = self. preorderTraversal( root. right) return left + [ root. val] + rightdef postorderTraversal ( self, root: TreeNode) - > list [ int ] : if not root: return [ ] left = self. preorderTraversal( root. left) right = self. preorderTraversal( root. right) return left + right + [ root. val]
非递归版本
class TreeNode : def __init__ ( self, val= 0 , left= None , right= None ) : self. val = valself. left = leftself. right = rightclass Solution : def preorderTraversal ( self, root: TreeNode) - > list [ int ] : if not root: return [ ] stack = [ root] result = [ ] while stack: node = stack. pop( ) result. append( node. val) if node. right: stack. append( node. right) if node. left: stack. append( node. left) return resultdef inorderTraversal ( self, root: TreeNode) - > list [ int ] : if not root: return [ ] stack = [ ] result = [ ] cur = rootwhile cur or stack: if cur: stack. append( cur) cur = cur. leftelse : cur = stack. pop( ) result. append( cur. val) cur = cur. rightreturn resultdef postorderTraversal ( self, root: TreeNode) - > list [ int ] : if not root: return [ ] stack = [ root] result = [ ] while stack: node = stack. pop( ) result. append( node. val) if node. left: stack. append( node. left) if node. right: stack. append( node. right) return result[ : : - 1 ]
非递归版本(代码统一)
class TreeNode : def __init__ ( self, val= 0 , left= None , right= None ) : self. val = valself. left = leftself. right = rightclass Solution : def preorderTraversal ( self, root: TreeNode) - > list [ int ] : result = [ ] st = [ ] if root: st. append( root) while st: node = st. pop( ) if node != None : if node. right: st. append( node. right) if node. left: st. append( node. left) st. append( node) st. append( None ) else : node = st. pop( ) result. append( node. val) return resultdef inorderTraversal ( self, root: TreeNode) - > list [ int ] : result = [ ] st = [ ] if root: st. append( root) while st: node = st. pop( ) if node != None : if node. right: st. append( node. right) st. append( node) st. append( None ) if node. left: st. append( node. left) else : node = st. pop( ) result. append( node. val) return resultdef postorderTraversal ( self, root: TreeNode) - > list [ int ] : result = [ ] st = [ ] if root: st. append( root) while st: node = st. pop( ) if node != None : st. append( node) st. append( None ) if node. right: st. append( node. right) if node. left: st. append( node. left) else : node = st. pop( ) result. append( node. val) return result
层次遍历
from collections import dequeclass TreeNode : def __init__ ( self, val= 0 , left= None , right= None ) : self. val = valself. left = leftself. right = rightclass Solution : def levelOrder ( self, root: TreeNode) - > list [ int ] : if not root: return [ ] queue = deque( [ root] ) result = [ ] while queue: node = queue. popleft( ) result. append( node. val) if node. left: queue. append( node. left) if node. right: queue. append( node. right) return result