生成所有可能的深度为 N 的树?

2023-11-29

我有几种不同类型的树节点,每个节点可能有 0 到 5 个子节点。我正在尝试找出一种算法来生成所有可能的深度


Here's a Python program I wrote up that I think does what you're asking. It'll return all of the possible trees given a starting node. Essentially, it boils down to a trick with bit manipulation: if a node has 5 children, then there are 25 = 32 different possible subtrees as each child can independently be present or not present in a subtree.

Code:

#!/usr/bin/env python

def all_combos(choices):
    """
    Given a list of items (a,b,c,...), generates all possible combinations of
    items where one item is taken from a, one from b, one from c, and so on.

    For example, all_combos([[1, 2], ["a", "b", "c"]]) yields:

        [1, "a"]
        [1, "b"]
        [1, "c"]
        [2, "a"]
        [2, "b"]
        [2, "c"]
    """
    if not choices:
        yield []
        return

    for left_choice in choices[0]:
        for right_choices in all_combos(choices[1:]):
            yield [left_choice] + right_choices

class Node:
    def __init__(self, value, children=[]):
        self.value    = value
        self.children = children

    def all_subtrees(self, max_depth):
        yield Node(self.value)

        if max_depth > 0:
            # For each child, get all of its possible sub-trees.
            child_subtrees = [list(self.children[i].all_subtrees(max_depth - 1)) for i in range(len(self.children))]

            # Now for the n children iterate through the 2^n possibilities where
            # each child's subtree is independently present or not present. The
            # i-th child is present if the i-th bit in "bits" is a 1.
            for bits in xrange(1, 2 ** len(self.children)):
                for combos in all_combos([child_subtrees[i] for i in range(len(self.children)) if bits & (1 << i) != 0]):
                    yield Node(self.value, combos)

    def __str__(self):
        """
        Display the node's value, and then its children in brackets if it has any.
        """
        if self.children:
            return "%s %s" % (self.value, self.children)
        else:
            return str(self.value)

    def __repr__(self):
        return str(self)

tree = Node(1,
[
    Node(2),
    Node(3,
    [
        Node(4),
        Node(5),
        Node(6)
    ])
])

for subtree in tree.all_subtrees(2):
    print subtree

这是测试树的图形表示:



  1
 / \
2   3
   /|\
  4 5 6
  

这是运行程序的输出:



1
1 [2]
1 [3]
1 [3 [4]]
1 [3 [5]]
1 [3 [4, 5]]
1 [3 [6]]
1 [3 [4, 6]]
1 [3 [5, 6]]
1 [3 [4, 5, 6]]
1 [2, 3]
1 [2, 3 [4]]
1 [2, 3 [5]]
1 [2, 3 [4, 5]]
1 [2, 3 [6]]
1 [2, 3 [4, 6]]
1 [2, 3 [5, 6]]
1 [2, 3 [4, 5, 6]]
  

如果您愿意,我可以将其翻译成其他语言。你没有指定,所以我使用Python;使用 Java 或 C++ 或其他语言编写的代码会更加冗长,因为我大量利用了 Python 的列表推导式。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

生成所有可能的深度为 N 的树? 的相关文章

  • 基于级别的嵌套数组

    0 content Heading 1 2 3 4 5 level 2 anchor heading 1 2 3 4 5 className testtest fontWeight 1 content Heading 2 level 2 a
  • 用于构建结构化二进制数据解析器的框架?

    我在实用程序员类型代码生成方面有一些经验 以与平台无关的格式指定数据结构 并为代码生成器编写模板 该代码生成器使用这些数据结构文件并生成将原始字节拉入特定于语言的数据结构的代码 对数字数据进行缩放 打印出数据等 好的实用 TM 想法是 a
  • C# 解析宽松的 json 来制作一棵树

    所以我需要解析类似这样的文件 pl GENERIC BACK COFNIJ WAIT CZEKAJ PAGES ABOUTME ID ID INFO STATUS STATUS TOP MENU LOGGED Zalogowany OPTI
  • 单击节点时打开分支?

    我被困住了jsTree http www jstree com 这里 到目前为止 它有效 我可以使用 图标浏览和展开节点 并在单击节点时打开页面 但我仍然希望它在有人单击节点时展开所有直接节点 我环视了至少两个小时 但什么也没找到 官方网站
  • 树 /f cmd 修改日期。 Windows Powershell

    我需要创建一个 tree驱动器的文件夹 子文件夹和修改日期的列表 tree f命令效果很好 但我需要添加修改日期 我怎样才能做到这一点 它不会那么漂亮 但你可以使用 Recurse使用 Get ChildItem 选项来查找所有这些 此外
  • 创建二叉树的时间复杂度

    我正在尝试从提供的源创建一棵树 要添加到树中的 2 个节点 以及应添加这 2 个新闻节点的节点 为了找到该节点在树中的位置 我使用了中序遍历 该遍历的时间复杂度为 O n 因此 如果要在树中添加 n 个节点 则创建整个树的时间复杂度为 O
  • C 有没有做字符串加法的工具?

    我正在创建一个函数 该函数返回函数的导数 该函数表示为树形结构 x 5 3 14 x 具有以下形式的节点 typedef struct node char fx function struct node gx left hand side
  • 如何递归探索Python嵌套字典? [复制]

    这个问题在这里已经有答案了 我很好奇是否有一种方法可以在 python 中递归地探索嵌套字典 我的意思是 假设我们有一个如下示例 d a b c 1 2 3 获取最里面字典的内容需要什么代码 c 1 2 3 遍历a and b 在这种情况下
  • 重用语义分析阶段的符号表来生成代码

    我目前正在为一种具有全局变量和嵌套子例程功能的语言构建编译器 以前 我只为只有局部变量而没有嵌套子例程的语言构建过编译器 我有一个关于如何重用在代码生成阶段的语义分析阶段填充的符号表的问题 我将符号表作为链表堆栈 其中每个链表代表在特定范围
  • 迭代多级提升树

    我的树看起来像这样 Library L ID 1 Book B ID 1 Title Moby Dick Book B ID 2 Title Jurassic Park Library L ID 2 Book B ID 1 Title Ve
  • 寻找成熟的 M-Tree 实现 [关闭]

    Closed 这个问题不符合堆栈溢出指南 help closed questions 目前不接受答案 我正在寻找一个成熟的 java M Tree 实现 甚至任何 M Tree 实现 除了我找到的唯一实现 http en wikipedia
  • D3可折叠树不同节点颜色

    我在 d3 js 中有一个可折叠的树 我的目标是通过 类型 属性为节点着色 例如 类型 str 的节点应填充为红色 而类型 elem 的节点应填充为绿色 我就是无法让它发挥作用 有人能帮助我吗 这是我的代码
  • 为什么在算法中使用子树大小来选择二叉树中的随机节点?

    我偶然发现了从二叉树中选择随机节点的算法的几种实现 它们都使用子树大小属性 但是 我不明白为什么知道子树大小有帮助 这是实现A https stackoverflow com a 32011526 and B https www geeks
  • 如何编写非默认排序规则的脚本并跳过默认排序规则的显式脚本?

    在SSMS 2008 R2中 我创建了一个表 aTest Albnian varchar 10 Dflt varchar 10 在 SSMS 表设计器中 两列都有排序规则 在 列属性 表设计器 下 我将 Albnian 列的排序规则更改为非
  • 使用 Sethi-Ullman 算法的表达式的代码生成器

    Give a AST tree http en wikipedia org wiki Abstract syntax tree 我想生成一种类似汇编的语言 我正在尝试使用塞西 乌尔曼 http en wikipedia org wiki S
  • 如何在代码生成过程中简化包含变量的 C 风格算术表达式?

    我正在尝试优化编译器中的表达式求值 算术表达式都是C风格的 并且它们可以包含变量 我希望尽可能简化表达 例如 3 100 A B 100 3 100可以简化为409 300 A B 主要取决于分配律 结合律和交换律 我遇到的主要困难是如何将
  • 为 Json 对象生成的 C# 类的优点和缺点

    我有示例 Json 我需要将其序列化为 C 对象 我决定为此目的利用杠杆Json Net http json codeplex com 图书馆 我还需要有 C 类来表示这个 Json 可以使用创建类Json C 类生成器 http json
  • 如何使用 d3.v4 中的 JSON 数据创建树布局 - 不使用 stratify()

    我正在尝试将一些 d3 代码从 v3 更新到版本 4 我有一个使用 JSON 数据的树形图 d3 v4 示例展示了如何使用 stratify 将表格数据 例如flare csv 转换为分层数据https bl ocks org mbosto
  • 如何使用 XSLT 从平面 XML 列表构建树?

    我使用极简 MVC 框架 其中PHP控制器手上的DOM模型 to the XSLT 视图 c f okapi http okapi liip ch 为了构建导航树 我在 MYSQL 中使用了嵌套集 这样 我最终得到一个如下所示的模型 XML
  • 我该如何实现这个折叠功能呢?

    给出了两种数据类型 颜色 和 植物 data Color Red Pink White Blue Purple Green Yellow deriving Show Eq data Plant Leaf Blossom Color Stal

随机推荐

  • 如何将 Apple 脚本的输出返回到 macOS 中的状态栏?

    我正在编写一个脚本 该脚本会在一个应用程序中查找您执行某项活动所花费的时间 然后在 Mac 的状态栏中显示该数字 就像右上角不断计数的时钟一样 我见过其他类似的人可以向您显示同一区域的 IP 这与我想要实现的目标很接近 我认为我的脚本可以持
  • Mongo 聚合与 Java for 循环和性能

    我存储了以下 mongo 文档 Field1 ABC Field2 Field3 ABC1 Field4 id 123 id 234 id 345 Field3 ABC2 Field4 id 123 id 234 id 345 Field3
  • 通过重命名旧表然后填充新版本来将表停机时间降至最低?

    我有一些左右的永久桌子需要每晚重建 为了使这些表尽可能长时间地 活动 并且也提供仅备份前一天数据的可能性 另一位开发人员含糊地建议 当夜间构建发生时 采取与此类似的路线 创建永久表 构建版本 例如 tbl build Client 重命名活
  • MYSQL 中的批量插入

    在 MS SQL 上 我可以使用下面的 sql 命令进行批量插入 BULK INSERT myDatabase MyTable FROM C MyTextFile txt WITH FIELDTERMINATOR 现在我想在 MySQL 上
  • 如何计算JavaScript中的图像加载/渲染时间?

    有没有办法使用 javascript jquery 查找网页中的图像加载 渲染时间 这里正确的答案是使用 Chrome 或 Firefox Firebug 等浏览器内置的开发工具 它会告诉您页面中所有资源的加载时间 这些工具可以访问纯 Ja
  • PHP - 遍历文件夹并显示 HTML 内容

    我目前正在尝试开发一种方法来概述我多年来创建和 合法 下载的所有不同的网页模板 我想过像这样展示它们WordPress正在使用一个小的预览窗口预览其模板 显示带有样式和所有内容的具体文件 如何将它们分为行和列并创建Ajax模式窗口在预览和分
  • 提高远程桌面上的 WPF 应用程序速度?

    在我们的场景中 我们有一个wpf应用程序 供用户通过远程桌面使用 我们发现用户体验非常慢 对于改善这种情况下的用户体验有什么建议吗 其中一点可能是禁用任何动画 故事板 并避免在 UI 中使用渐变 更多想法值得赞赏 对于渐变来说 这不像多个渲
  • unix 中正则表达式的语法错误

    我尝试找到一个与 1 到 999 之间的任何数字匹配的正则表达式 当使用钩子时我收到语法错误 bash syntax error near unexpected token 当我不使用钩子时 什么也不会发生 我的正则表达式是 egrep 1
  • Android 操作栏:我可以替换 appcompat v7 中的自定义标题吗

    我想在肌动蛋白条的左侧添加自定义操作标题 替换为默认标题 如下图所示 显示默认图像 在这里我想添加这个标题 您需要更改操作栏中的徽标和标题 您可以使用 getActivity getActionBar setTitle your title
  • Perl:如何使所需脚本中的变量在所需脚本中可用

    example out pl my our local global whatever var test require inside pm 里面 pm print var 我不想使用软件包 它超出了我的需求 谢谢 You are alwa
  • 对数组进行排序所需的最少操作数

    我正在尝试练习解决 Codeforces 中的问题 它通过将数组的元素移动到数组的开头或结尾来对数组进行排序 起初我认为它是最长的递增子序列 但在某些情况下它不起作用 例如 如果输入是 4 1 2 5 3 则 LIS 是 3 但问题的答案是
  • 如何在 C#.NET 中更改图像的像素颜色

    我正在Java中处理图像 我设计了超过100多个图像 png 格式 它们都是透明和黑色绘图 问题是 现在我被要求更改绘图的颜色 黑色 我在谷歌上搜索了许多代码 这些代码改变了图像的位图 像素 但我不猜测我必须做什么来匹配确切的像素 并在图像
  • 构建战争时删除插件视图(gsp)

    我们在 grails 应用程序中使用各种插件 如日志记录 spring security core ui acl 等 现在这些插件带有默认的 gsp 在每个插件的视图文件夹中 我想构建一个 WAR 而不包含任何插件的视图 因此 当战争现在构
  • ASP.NET 中的多选下拉列表

    asp net 是否存在任何好的带有复选框 webcontrol 的多选下拉列表 多谢 你可以使用System Web UI WebControls CheckBoxList控制或使用System Web UI WebControls Li
  • android 棒棒糖通知背景颜色

    是否可以更改 android lollipop 中通知的背景颜色 我注意到有些通知是白色的 有些是浅灰色的 有些是深灰色的 source gottabemobile com source sftcdn net 您可以看到音乐播放器通知具有深
  • 如何使用PyTorch计算偏导数?

    我想使用 PyTorch 获取输出和输入之间的偏导数 假设我有一个函数Y 5 x1 4 3 x2 3 7 x1 2 9 x2 5 然后我训练一个网络来替换这个函数 然后我使用 autograd 来计算dYdx1 dYdx2 net torc
  • 将 pandas 数据框中的所有行除以特定行

    我有一个 pandas 数据框 如下所示 Sample name C14 Cer mean C16 Cer mean C18 Cer mean C18 1 Cer mean 0 1 1 0 124749 0 285659 35 302029
  • EC2 启动时自动启动 docker-compose

    我有一个 Linux AMI 2 AWS 实例 其中包含一些通过 docker compose 编排的服务 并且我使用 docker compose up 或 docker compose start 命令来启动它们 现在我每天都会自动启动
  • 通过 ssh 包装命令:如何管理复杂的引号?

    我使用 HPC 集群 计算节点无法访问互联网 只能访问前端 所以我想包装所有需要访问互联网的命令 以便在正面执行它们 例如 对于 wget bin bash ssh frontal bin wget gt 工作正常 我必须包装这个 bq g
  • 生成所有可能的深度为 N 的树?

    我有几种不同类型的树节点 每个节点可能有 0 到 5 个子节点 我正在尝试找出一种算法来生成所有可能的深度 Here s a Python program I wrote up that I think does what you re a