目录
一、概念
前序遍历:先访问根节点,再访问左子节点,最后访问右子节点
中序遍历:先访问左子节点,再访问根节点,最后访问右子节点
后序遍历:先访问左子节点,再访问右子节点,最后访问根节点
class TreeNode:
def __init__(self, x):
self.val = x
self.left = None
self.right = None
二、前序遍历代码实现
# 递归实现
def preorderTraversal(root):
if root is None:
return
print(root.val)
if root.left:
preorderTraversal(root.left)
if root.right:
preorderTraversal(root.right)
# 迭代法1实现,要结合着栈的使用
def preorderTraversal(root):
res = []
stack = []
while stack or root:
while root:
res.append(root.val)
stack.append(root)
root=root.left
root=stack.pop()
root=root.right
return res
# 迭代法2实现,要结合着栈的使用
def preorderTraversal(root):
if root is None:
return []
res = []
temp = [root]
while temp:
temp_root = temp.pop()
if temp_root is not None:
res.append(temp_root.val)
if temp_root.right:
temp.append(temp_root.right)
if temp_root.left:
temp.append(temp_root.left)
return res
三、中序遍历代码实现
# 递归实现
def inorderTraversal(root):
if root is None:
return
if root.left:
inorderTraversal(root.left)
print(root.val)
if root.right:
inorderTraversal(root.right)
# 迭代实现,结合着栈的使用
def inorderTraversal(root):
res = []
stack= []
while stack or root:
while root:
stack.append(root)
root=root.left
root = stack.pop()
res.append(root.val)
root = root.right # root.right的root为stack.pop()弹出的节点
return res
四、后序遍历代码实现
# 递归实现
def postorderTraversal(root):
if root is None:
return
if root.left:
postorderTraversal(root.left)
if root.right:
postorderTraversal(root.right)
print(root.val)
# 迭代实现,要结合着栈的使用
def postorderTraversal(root):
# 对[根,右,左]进行反转则[左,右,根]即后序遍历
res = []
stack = []
while stack or root:
while root:
res.append(root.val)
stack.append(root)
root=root.right
root = stack.pop()
root = root.left # root.left的root为stack.pop()弹出的节点
return res[::-1]