Loading

数据结构 二叉树遍历

我们使用python 代码来生成一个二叉树遍历图例
在代码中依次输入的前序遍历

# input
Enter preorder traversal (space-separated, use 'None' for null nodes): 1 2 4 None None 5 None None 3 6 None None 7 None None

代码如下:

import matplotlib.pyplot as plt

class Node:
    def __init__(self, value):
        self.value = value
        self.left = None
        self.right = None

def build_tree_from_preorder(preorder):
    if not preorder:
        return None
    
    root_value = preorder.pop(0)
    if root_value is None:
        return None
    
    root = Node(root_value)
    root.left = build_tree_from_preorder(preorder)
    root.right = build_tree_from_preorder(preorder)
    return root

def plot_tree(node, x, y, dx, dy, ax):
    if node:
        ax.text(x, y, str(node.value), style='italic', bbox={'facecolor': 'red', 'alpha': 0.5, 'pad': 10})
        if node.left:
            ax.plot([x, x - dx], [y, y - dy], 'k-')
            plot_tree(node.left, x - dx, y - dy, dx / 2, dy, ax)
        if node.right:
            ax.plot([x, x + dx], [y, y - dy], 'k-')
            plot_tree(node.right, x + dx, y - dy, dx / 2, dy, ax)

def main():
    # 输入前序遍历数组
    preorder_input = input("Enter preorder traversal (space-separated, use 'None' for null nodes): ")
    preorder = []
    for value in preorder_input.split():
        if value.lower() == 'none':
            preorder.append(None)
        else:
            preorder.append(int(value))
    
    # 构建二叉树
    root = build_tree_from_preorder(preorder)
    
    # 输出前序遍历结果
    print("Preorder Traversal:", preorder)
    
    # 绘制树结构
    fig, ax = plt.subplots()
    plot_tree(root, 0, 0, 100, 100, ax)
    ax.set_aspect('equal')
    ax.axis('off')
    plt.show()

if __name__ == "__main__":
    main()
# output
Preorder Traversal: [1, 2, 4, None, None, 5, None, None, 3, 6, None, None, 7, None, None]

# input
Enter preorder traversal (space-separated, use 'None' for null nodes): 1 None 2 None 3 None 4
# output
Preorder Traversal: [1, None, 2, None, 3, None, 4]
  1
   \
    2
     \
      3
       \
        4
Enter preorder traversal (space-separated, use 'None' for null nodes): 1 2 None None 3 4 None None 5 None None
Preorder Traversal: [1, 2, None, None, 3, 4, None, None, 5, None, None]

      1
     / \
    2   3
       / \
      4   5

中序遍历

import matplotlib.pyplot as plt

class Node:
    def __init__(self, value):
        self.value = value
        self.left = None
        self.right = None

def build_balanced_tree_from_inorder(inorder):
    """根据中序遍历数组构建平衡二叉树"""
    if not inorder:
        return None
    
    mid = len(inorder) // 2
    root = Node(inorder[mid])
    
    root.left = build_balanced_tree_from_inorder(inorder[:mid])
    root.right = build_balanced_tree_from_inorder(inorder[mid+1:])
    
    return root

def plot_tree(node, x, y, dx, dy, ax):
    """递归绘制树结构"""
    if node:
        ax.text(x, y, str(node.value), style='italic', bbox={'facecolor': 'red', 'alpha': 0.5, 'pad': 10})
        if node.left:
            ax.plot([x, x - dx], [y, y - dy], 'k-')
            plot_tree(node.left, x - dx, y - dy, dx / 2, dy, ax)
        if node.right:
            ax.plot([x, x + dx], [y, y - dy], 'k-')
            plot_tree(node.right, x + dx, y - dy, dx / 2, dy, ax)

def main():
    # 输入中序遍历数组
    inorder_input = input("Enter inorder traversal (space-separated): ")
    inorder = list(map(int, inorder_input.split()))
    
    # 构建平衡二叉树
    root = build_balanced_tree_from_inorder(inorder)
    
    # 输出中序遍历结果(验证)
    print("Inorder Traversal (验证):", inorder_traversal(root))
    
    # 绘制树结构
    fig, ax = plt.subplots()
    plot_tree(root, 0, 0, 100, 100, ax)
    ax.set_aspect('equal')
    ax.axis('off')
    plt.show()

def inorder_traversal(root):
    """中序遍历(用于验证)"""
    if not root:
        return []
    return inorder_traversal(root.left) + [root.value] + inorder_traversal(root.right)

if __name__ == "__main__":
    main()
# output
Enter inorder traversal (space-separated): 4 2 5 1 6 3 7

# 根据前序遍历和后序遍历输出中序遍历
# 注意:根据前序遍历和后序遍历无法唯一确定一棵二叉树,因此需要假设树是一棵满二叉树(每个节点都有 0 或 2 个子节点)。以下代码基于此假设实现
import matplotlib.pyplot as plt

class Node:
    def __init__(self, value):
        self.value = value
        self.left = None
        self.right = None

def build_tree_from_preorder_postorder(preorder, postorder):
    if not preorder or not postorder:
        return None
    
    root_value = preorder[0]
    root = Node(root_value)
    
    if len(preorder) == 1:
        return root
    
    left_root_value = preorder[1]
    left_root_idx = postorder.index(left_root_value)
    
    root.left = build_tree_from_preorder_postorder(preorder[1:left_root_idx+2], postorder[:left_root_idx+1])
    root.right = build_tree_from_preorder_postorder(preorder[left_root_idx+2:], postorder[left_root_idx+1:-1])
    
    return root

def inorder_traversal(root):
    if not root:
        return []
    return inorder_traversal(root.left) + [root.value] + inorder_traversal(root.right)

def plot_tree(node, x, y, dx, dy, ax):
    if node:
        ax.text(x, y, str(node.value), style='italic', bbox={'facecolor': 'red', 'alpha': 0.5, 'pad': 10})
        if node.left:
            ax.plot([x, x - dx], [y, y - dy], 'k-')
            plot_tree(node.left, x - dx, y - dy, dx / 2, dy, ax)
        if node.right:
            ax.plot([x, x + dx], [y, y - dy], 'k-')
            plot_tree(node.right, x + dx, y - dy, dx / 2, dy, ax)

def main_preorder_postorder():
    preorder_input = input("Enter preorder traversal (space-separated): ")
    postorder_input = input("Enter postorder traversal (space-separated): ")
    
    preorder = list(map(int, preorder_input.split()))
    postorder = list(map(int, postorder_input.split()))
    
    if len(preorder) == len(postorder) and len(preorder) > 0:
        root = build_tree_from_preorder_postorder(preorder, postorder)
        print("Inorder traversal:", inorder_traversal(root))

        fig, ax = plt.subplots()
        plot_tree(root, 0, 0, 100, 100, ax)
        ax.set_aspect('equal')
        ax.axis('off')
        plt.show()
    else:
        print("Invalid input: Preorder and postorder traversals must have the same length and not be empty.")

if __name__ == "__main__":
    main_preorder_postorder()
# input
Enter preorder traversal (space-separated): 1 2 4 5 3 6 7
Enter postorder traversal (space-separated): 4 5 2 6 7 3 1
# output
Inorder traversal: [4, 2, 5, 1, 6, 3, 7]
# 根据中序遍历和后序遍历输出前序遍历
import matplotlib.pyplot as plt

class Node:
    def __init__(self, value):
        self.value = value
        self.left = None
        self.right = None

def build_tree_from_inorder_postorder(inorder, postorder):
    if not inorder or not postorder:
        return None
    
    root_value = postorder[-1]
    root = Node(root_value)
    
    mid_idx = inorder.index(root_value)
    
    root.left = build_tree_from_inorder_postorder(inorder[:mid_idx], postorder[:mid_idx])
    root.right = build_tree_from_inorder_postorder(inorder[mid_idx+1:], postorder[mid_idx:-1])
    
    return root

def preorder_traversal(root):
    if not root:
        return []
    return [root.value] + preorder_traversal(root.left) + preorder_traversal(root.right)

def plot_tree(node, x, y, dx, dy, ax):
    if node:
        ax.text(x, y, str(node.value), style='italic', bbox={'facecolor': 'red', 'alpha': 0.5, 'pad': 10})
        if node.left:
            ax.plot([x, x - dx], [y, y - dy], 'k-')
            plot_tree(node.left, x - dx, y - dy, dx / 2, dy, ax)
        if node.right:
            ax.plot([x, x + dx], [y, y - dy], 'k-')
            plot_tree(node.right, x + dx, y - dy, dx / 2, dy, ax)

def main_inorder_postorder():
    inorder_input = input("Enter inorder traversal (space-separated): ")
    postorder_input = input("Enter postorder traversal (space-separated): ")
    
    inorder = list(map(int, inorder_input.split()))
    postorder = list(map(int, postorder_input.split()))
    
    if len(inorder) == len(postorder) and len(inorder) > 0:
        root = build_tree_from_inorder_postorder(inorder, postorder)
        print("Preorder traversal:", preorder_traversal(root))
        
        fig, ax = plt.subplots()
        plot_tree(root, 0, 0, 100, 100, ax)
        ax.set_aspect('equal')
        ax.axis('off')
        plt.show()        
    else:
        print("Invalid input: Inorder and postorder traversals must have the same length and not be empty.")

if __name__ == "__main__":
    main_inorder_postorder()
Enter inorder traversal (space-separated): 4 2 5 1 6 3 7
Enter postorder traversal (space-separated): 4 5 2 6 7 3 1
Preorder traversal: [1, 2, 4, 5, 3, 6, 7]
# 根据中序遍历和前序遍历输出后序遍历
import matplotlib.pyplot as plt

class Node:
    def __init__(self, value):
        self.value = value
        self.left = None
        self.right = None

def build_tree(preorder, inorder):
    if not preorder or not inorder:
        return None
    
    root_value = preorder[0]
    root = Node(root_value)
    
    mid_idx = inorder.index(root_value)
    
    root.left = build_tree(preorder[1:mid_idx+1], inorder[:mid_idx])
    root.right = build_tree(preorder[mid_idx+1:], inorder[mid_idx+1:])
    
    return root

def postorder_traversal(root):
    if not root:
        return []
    return postorder_traversal(root.left) + postorder_traversal(root.right) + [root.value]

def plot_tree(node, x, y, dx, dy, ax):
    if node:
        ax.text(x, y, str(node.value), style='italic', bbox={'facecolor': 'red', 'alpha': 0.5, 'pad': 10})
        if node.left:
            ax.plot([x, x - dx], [y, y - dy], 'k-')
            plot_tree(node.left, x - dx, y - dy, dx / 2, dy, ax)
        if node.right:
            ax.plot([x, x + dx], [y, y - dy], 'k-')
            plot_tree(node.right, x + dx, y - dy, dx / 2, dy, ax)

def main():
    preorder_input = input("Enter preorder traversal (space-separated): ")
    inorder_input = input("Enter inorder traversal (space-separated): ")
    
    preorder = list(map(int, preorder_input.split()))
    inorder = list(map(int, inorder_input.split()))
    
    if len(preorder) == len(inorder) and len(preorder) > 0:
        root = build_tree(preorder, inorder)
        print("Postorder traversal:", postorder_traversal(root))
        
        fig, ax = plt.subplots()
        plot_tree(root, 0, 0, 100, 100, ax)
        ax.set_aspect('equal')
        ax.axis('off')
        plt.show()
    else:
        print("Invalid input: Preorder and inorder traversals must have the same length and not be empty.")

if __name__ == "__main__":
    main()
# input
Enter preorder traversal (space-separated): 1 2 4 5 3 6 7
Enter inorder traversal (space-separated): 4 2 5 1 6 3 7
# output
Postorder traversal: [4, 5, 2, 6, 7, 3, 1]

posted @ 2025-04-03 19:56  androllen  阅读(131)  评论(0)    收藏  举报