# Definition for a binary tree node.classTreeNode:def__init__(self, val=0, left=None, right=None):
self.val = val
self.left = left
self.right = right
classSolution:# 前序遍历defpreorderTraversal(self, root: TreeNode)->list[int]:ifnot root:return[]
left = self.preorderTraversal(root.left)
right = self.preorderTraversal(root.right)return[root.val]+ left + right
# 中序遍历definorderTraversal(self, root: TreeNode)->list[int]:ifnot root:return[]
left = self.preorderTraversal(root.left)
right = self.preorderTraversal(root.right)return left +[root.val]+ right
# 后序遍历defpostorderTraversal(self, root: TreeNode)->list[int]:ifnot root:return[]
left = self.preorderTraversal(root.left)
right = self.preorderTraversal(root.right)return left + right +[root.val]
非递归版本
# Definition for a binary tree node.classTreeNode:def__init__(self, val=0, left=None, right=None):
self.val = val
self.left = left
self.right = right
classSolution:# 前序遍历defpreorderTraversal(self, root: TreeNode)->list[int]:# 根结点为空则返回空列表ifnot 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 result
# 中序遍历definorderTraversal(self, root: TreeNode)->list[int]:ifnot root:return[]
stack =[]# 不能提前将root结点加入stack中
result =[]
cur = root
while cur or stack:# 先迭代访问最底层的左子树结点if cur:
stack.append(cur)
cur = cur.left
# 到达最左结点后处理栈顶结点else:
cur = stack.pop()
result.append(cur.val)# 取栈顶元素右结点
cur = cur.right
return result
# 后序遍历defpostorderTraversal(self, root: TreeNode)->list[int]:ifnot 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]
非递归版本(代码统一)
# Definition for a binary tree node.classTreeNode:def__init__(self, val=0, left=None, right=None):
self.val = val
self.left = left
self.right = right
classSolution:# 前序遍历defpreorderTraversal(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 result
# 中序遍历definorderTraversal(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 result
# 后序遍历defpostorderTraversal(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 deque
classTreeNode:def__init__(self, val=0, left=None, right=None):
self.val = val
self.left = left
self.right = right
classSolution:deflevelOrder(self, root: TreeNode)->list[int]:ifnot 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