在Python中,遍历树通常指的是访问二叉树的所有节点,并按照一定的顺序打印出节点的值。以下是几种常见的二叉树遍历方法及其实现:
1. 前序遍历(Pre-order Traversal)
前序遍历的顺序是:根节点 -> 左子树 -> 右子树。
递归实现
def preorder_traversal_recursive(root):if root is not None:print(root.val) 访问根节点preorder_traversal_recursive(root.left) 递归访问左子树preorder_traversal_recursive(root.right) 递归访问右子树
迭代实现
def preorder_traversal_iterative(root):if root is None:returnstack = [root]while stack:node = stack.pop()if node is not None:print(node.val) 访问根节点stack.append(node.right) 先右后左,保证左子树先被访问stack.append(node.left)
2. 中序遍历(In-order Traversal)
中序遍历的顺序是:左子树 -> 根节点 -> 右子树。
递归实现
def inorder_traversal_recursive(root):if root is not None:inorder_traversal_recursive(root.left) 递归访问左子树print(root.val) 访问根节点inorder_traversal_recursive(root.right) 递归访问右子树
迭代实现
def inorder_traversal_iterative(root):stack = []current = rootwhile current is not None or stack:while current is not None:stack.append(current)current = current.leftcurrent = stack.pop()print(current.val) 访问根节点current = current.right
3. 后序遍历(Post-order Traversal)
后序遍历的顺序是:左子树 -> 右子树 -> 根节点。
递归实现
def postorder_traversal_recursive(root):if root is not None:postorder_traversal_recursive(root.left) 递归访问左子树postorder_traversal_recursive(root.right) 递归访问右子树print(root.val) 访问根节点
迭代实现
def postorder_traversal_iterative(root):if root is None:returnstack = [root]last_visited = Nonewhile stack:node = stack[-1]if (node.left is None and node.right is None) or \(last_visited and (last_visited == node.left or last_visited == node.right)):print(node.val) 访问根节点last_visited = stack.pop()else:if node.right:stack.append(node.right)if node.left:stack.append(node.left)
4. 层序遍历(Breadth-first Traversal)
层序遍历的顺序是从根节点开始,按层次顺序访问所有节点。
迭代实现
from collections import dequedef level_order_traversal_iterative(root):if root is None:returnqueue = deque([root])while queue:node = queue.popleft()print(node.val) 访问当前节点if node.left:queue.append(node.left)if node.right:queue.append(node.right)
以上代码示例中,`TreeNode` 类代表树的节点,每个节点包含一个值 `val` 和指向左右子节点的指针 `left` 和 `right`。递归和迭代实现
版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 举报,一经查实,本站将立刻删除。
如需转载请保留出处:https://sigusoft.com/bj/139029.html