用Python递归实现多级菜单树
  AQdZjrbQ7gOZ 2023年11月02日 21 0


背景

如何使用Python递归构建一个多级的树形结构,并能够打印出树的全貌。为了解决这个问题,我选择了使用面向对象编程和递归算法,利用自定义的节点类和树类来构建树结构。

数据格式

首先,我定义了一个节点类 TreeNode,它表示树中的节点,包含节点名称和子节点列表。然后,我定义了一个树类 Tree,用于构建树结构并提供相关的操作方法。

构建树

为了演示这个问题,我以一个三级的菜单树为例,自行给出了如下的菜单数据格式:

menu_data = {
    "name": "菜单",
    "children": [
        {
            "name": "一级菜单1",
            "children": [
                {
                    "name": "二级菜单1",
                    "children": [
                        {"name": "三级菜单1"},
                        {"name": "三级菜单2"},
                        {"name": "三级菜单3"}
                    ]
                },
                {
                    "name": "二级菜单2",
                    "children": [
                        {"name": "三级菜单4"},
                        {"name": "三级菜单5"}
                    ]
                }
            ]
        },
        {
            "name": "一级菜单2",
            "children": [
                {
                    "name": "二级菜单3",
                    "children": [
                        {"name": "三级菜单6"},
                        {"name": "三级菜单7"}
                    ]
                }
            ]
        }
    ]
}

接着,我使用递归算法按照节点类和树类的定义来构建这棵树。

代码实现

首先,我们定义节点类 TreeNode

class TreeNode:
    def __init__(self, name):
        self.name = name
        self.children = []

    def add_child(self, child_node):
        self.children.append(child_node)

    def print_tree(self, level=0):
        print("  " * level + "- " + self.name)
        for child in self.children:
            child.print_tree(level + 1)

然后,我们定义树类 Tree

class Tree:
    def __init__(self):
        self.root = None

    def add_node(self, parent_node_name, node):
        if not self.root:
            self.root = node
            return

        parent_node = self.find_node(self.root, parent_node_name)
        if parent_node:
            parent_node.add_child(node)
        else:
            raise ValueError("Parent node not found!")

    def find_node(self, current_node, target_name):
        if current_node.name == target_name:
            return current_node

        for child in current_node.children:
            found_node = self.find_node(child, target_name)
            if found_node:
                return found_node

        return None

    def print_tree(self):
        if not self.root:
            print("Tree is empty!")
            return

        print("Tree:")
        self.root.print_tree()

接下来,我们使用上述节点类和树类来构建树,并打印出树的全貌。

# 构建菜单树
menu_tree = Tree()

def build_tree(node_data, parent_node=None):
    current_node = TreeNode(node_data["name"])
    if parent_node:
        parent_node.add_child(current_node)

    if "children" in node_data:
        for child_data in node_data["children"]:
            build_tree(child_data, current_node)

build_tree(menu_data)

# 打印树的全貌
menu_tree.print_tree()

运行结果

以上代码将输出如下的树的全貌:

Tree:
- 菜单
  - 一级菜单1
    - 二级菜单1
      - 三级菜单1
      - 三级菜单2
      - 三级菜单3
    - 二级菜单2
      - 三级菜单4
      - 三级菜单5
  - 一级菜单2
    - 二级菜单3
      - 三级菜单6
      - 三级菜单7

总结

通过使用Python的面向对象编程和递归算法,我们成功构建了一个多级菜单树,并实现了打印树的全貌。这种方法具有足够的共通性,适用于构建不同层级的树结构。递归算法的简洁性和灵活性使得构建树变得更加简单,同时也增强了代码的可读性。

【版权声明】本文内容来自摩杜云社区用户原创、第三方投稿、转载,内容版权归原作者所有。本网站的目的在于传递更多信息,不拥有版权,亦不承担相应法律责任。如果您发现本社区中有涉嫌抄袭的内容,欢迎发送邮件进行举报,并提供相关证据,一经查实,本社区将立刻删除涉嫌侵权内容,举报邮箱: cloudbbs@moduyun.com

  1. 分享:
最后一次编辑于 2023年11月08日 0

暂无评论

AQdZjrbQ7gOZ