下面是详细讲解“Python实现二叉树的常见遍历操作总结【7种方法】”的完整攻略。
1. 什么是二叉树
二叉树是一种树形结构,每个节点最多有两个子节点。二叉树的遍历是指按照一定的顺序访问二叉树中的所有节点。
2. 二叉树的遍历方法
以下是二叉树的七种遍历方法,包括前序遍历、中序遍历、后序遍历、层次遍历、Morris遍历、递归遍历和迭代遍历。
2.1 前序遍历
前序遍历是指先访问根节点,然后访问左子树,最后访问右子树。以下是一个前序遍历的示例。
class TreeNode:
def __init__(self, val=0, left=None, right=None):
self.val = val
self.left = left
self.right = right
def preorderTraversal(root: TreeNode) -> List[int]:
if not root:
return []
res = []
stack = [root]
while stack:
node = stack.pop()
res.append(node.val)
if node.right:
stack.append(node.right)
if node.left:
stack.append(node.left)
return res
2.2 中序遍历
中序遍历是指先访问左子树,然后访问根节点,最后访问右子树。以下是一个中序遍历的示例。
def inorderTraversal(root: TreeNode) -> List[int]:
if not root:
return []
res = []
stack = []
node = root
while stack or node:
while node:
stack.append(node)
node = node.left
node = stack.pop()
res.append(node.val)
node = node.right
return res
2.3 后序遍历
后序遍历是指先访问左子树,然后访问右子树,最后访问根节点。以下是一个后序遍历的示例。
def postorderTraversal(root: TreeNode) -> List[int]:
if not root:
return []
res = []
stack = [root]
while stack:
node = stack.pop()
res.append(node.val)
if node.left:
stack.append(node.left)
if node.right:
stack.append(node.right)
return res[::-1]
2.4 层次遍历
层次遍历是指按照从上到下、从左到右的顺序访问二叉树中的所有节点。以下是一个层次遍历的示例。
def levelOrder(root: TreeNode) -> List[List[int]]:
if not root:
return []
res = []
queue = [root]
while queue:
level = []
for _ in range(len(queue)):
node = queue.pop(0)
level.append(node.val)
if node.left:
queue.append(node.left)
if node.right:
queue.append(node.right)
res.append(level)
return res
2.5 Morris遍历
Morris遍历是一种不需要使用栈或队列的遍历方法,它利用了线索二叉树的思想。以下是一个Morris遍历的示例。
def morrisTraversal(root: TreeNode) -> List[int]:
if not root:
return []
res = []
cur = root
while cur:
if not cur.left:
res.append(cur.val)
cur = cur.right
else:
pre = cur.left
while pre.right and pre.right != cur:
pre = pre.right
if not pre.right:
pre.right = cur
res.append(cur.val)
cur = cur.left
else:
pre.right = None
cur = cur.right
return res
2.6 递归遍历
递归遍历是指使用递归函数遍历二叉树中的所有节点。以下是一个递归遍历的示例。
def preorderTraversal(root: TreeNode) -> List[int]:
if not root:
return []
return [root.val] + preorderTraversal(root.left) + preorderTraversal(root.right)
def inorderTraversal(root: TreeNode) -> List[int]:
if not root:
return []
return inorderTraversal(root.left) + [root.val] + inorderTraversal(root.right)
def postorderTraversal(root: TreeNode) -> List[int]:
if not root:
return []
return postorderTraversal(root.left) + postorderTraversal(root.right) + [root.val]
2.7 迭代遍历
迭代遍历是指使用栈或队列遍历二叉树中的所有节点。以下是一个迭代遍历的示例。
def preorderTraversal(root: TreeNode) -> List[int]:
if not root:
return []
res = []
stack = [root]
while stack:
node = stack.pop()
res.append(node.val)
if node.right:
stack.append(node.right)
if node.left:
stack.append(node.left)
return res
def inorderTraversal(root: TreeNode) -> List[int]:
if not root:
return []
res = []
stack = []
node = root
while stack or node:
while node:
stack.append(node)
node = node.left
node = stack.pop()
res.append(node.val)
node = node.right
return res
def postorderTraversal(root: TreeNode) -> List[int]:
if not root:
return []
res = []
stack = [root]
while stack:
node = stack.pop()
res.append(node.val)
if node.left:
stack.append(node.left)
if node.right:
stack.append(node.right)
return res[::-1]
3. 示例说明
以下是两个示例说明,分别是前序遍历和中序遍历。
3.1 前序遍历
以下是一个前序遍历的示例,使用迭代方法遍历二叉树中的所有节点。
root = TreeNode(1)
root.left = TreeNode(2)
root.right = TreeNode(3)
root.left.left = TreeNode(4)
root.left.right = TreeNode(5)
print(preorderTraversal(root)) # [1, 2, 4, 5, 3]
3.2 中序遍历
以下是一个中序遍历的示例,使用迭代方法遍历二叉树中的所有节点。
root = TreeNode(1)
root.left = TreeNode(2)
root.right = TreeNode(3)
root.left.left = TreeNode(4)
root.left.right = TreeNode(5)
print(inorderTraversal(root)) # [4, 2, 5, 1, 3]
4. 总结
二叉树的遍历是指按照一定的顺序访问二叉树中的所有节点。Python中可以使用递归、迭代、Morris等方法遍历二叉树。本文介绍了二叉树的七种遍历方法,包括前序遍历、中序遍历、后序遍历、层次遍历、Morris遍历、递归遍历和迭代遍历,并提供了相应的示例。
本站文章如无特殊说明,均为本站原创,如若转载,请注明出处:Python实现二叉树的常见遍历操作总结【7种方法】 - Python技术站