知识点
- 递归函数的写法:
前序遍历:递归方法
class Solution(object):
def __init__(self):
self.res = []
def inorderTraversal(self, root):
self.traverse(root)
return self.res
def traverse(self, root):
if root is None:
return
self.res.append(root.val)
self.traverse(root.left)
self.traverse(root.right)
中序遍历:递归方法
class Solution(object):
def __init__(self):
self.res = []
def inorderTraversal(self, root):
self.traverse(root)
return self.res
def traverse(self, root):
if root is None:
return
self.traverse(root.left)
self.res.append(root.val)
self.traverse(root.right)
后序遍历:递归方法
class Solution(object):
def __init__(self):
self.res = []
def inorderTraversal(self, root):
self.traverse(root)
return self.res
def traverse(self, root):
if root is None:
return
self.traverse(root.left)
self.traverse(root.right)
self.res.append(root.val)
迭代方法遍历二叉树
# 前序遍历-迭代-LC144_二叉树的前序遍历
class Solution:
def preorderTraversal(self, root):
# 根结点为空则返回空列表
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 result
# 中序遍历-迭代-LC94_二叉树的中序遍历
class Solution:
def inorderTraversal(self, root):
if not 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
# 后序遍历-迭代-LC145_二叉树的后序遍历
class Solution:
def postorderTraversal(self, root):
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 Solution:
def preorderTraversal(self, root):
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
# 中序遍历
class Solution:
def inorderTraversal(self, root):
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
# 后序遍历
class Solution:
def postorderTraversal(self, root):
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