当前位置: 首页 > 知识库问答 >
问题:

将m元树转换成n元树

詹正浩
2023-03-14
  • 给定一棵树的根。树可以是任何深度和宽度,
    • 即每个节点可以有任意数量的子节点。
    • 此方法应该以这样一种方式转换树,即每个节点(可能只有一个除外)都有N个或0个子节点(并且一个节点可能有多个介于0和N之间的子节点)。
    • 算法可以以任何方式转换给定的树,但只有一个条件:如果节点A是源树中节点B的优势节点B可能不是结果树中节点A的优势节点(尽管它们可能成为兄弟姐妹)。
    
    interface CompactTreeBuilder<T> {
        /**
         *
         * E.g.
         *
         * source:        compact(A, 2)     compact(A, 1)             compact(A, 100)
         *
         * A               A                 A                         A
         *  |               |                 |_B                       |_B
         *  |_B             |_B                  |_C                    |
         *     |            |  |                    |_D                 |_C
         *     |            |  |_D                     |_E              |
         *     |            |  |                          |_F           |_D
         *     |_C          |  |_E                           |_G        |
         *     | |_D        |    |_H                            |_H     |_E
         *     |    |_F     |                                           |
         *     |            |_C                                         |_F
         *     |_E            |                                         |
         *       |_G          |_F                                       |_G
         *       |            |                                         |
         *       |_H          |_G                                       |_H
         *
         *
         *  in an example for compact(A,2) above node E is an exception node:
         *  it has 1 child while any other node has either 2 or 0 children
         */
        Node<T> compact(Node<T> root, int N);
        }
     
        class Node<T> {
        private final T data;
     
        private final List<Node<T>> children;
     
        public Node(T data, List<Node<T>> children) {
            this.data = data;
            this.children = children;
        }
     
        public T getData() {
            return data;
        }
     
        public List<Node<T>> getChildren() {
            return children;
        }
    }
    
    

共有1个答案

魏泰
2023-03-14

一个简单的算法是:

以广度优先的顺序遍历输入树。将每个被访问的节点添加到新树中,也是以广度优先的顺序,确保将子节点添加到还没有N个子节点的节点中,并且当没有少于N个子节点的内部节点时,仅将第一个子节点添加到下一个叶子中(以广度优先的顺序)。

这将确保:

  • 目标树中永远不会有两个节点的子节点少于N个
  • 节点只能成为后来添加的节点的父节点。由于我们以广度优先顺序遍历输入树,这保证了节点永远不会成为其任何原始祖先的祖先
 类似资料:
  • 问题内容: 我有一个这样的元组列表: 我想在第一项中遍历此键,因此,例如,我可以打印如下内容: 我该如何在不保持项目跟踪第一个项目是否与我在元组周围循环相同的情况下进行此操作?感觉很乱(而且我必须先对列表进行排序)… 问题答案: 产生:

  • 本文向大家介绍在C ++中将三元表达式转换为二叉树,包括了在C ++中将三元表达式转换为二叉树的使用技巧和注意事项,需要的朋友参考一下 在本教程中,我们将讨论将三元表达式转换为二叉树的程序。 为此,我们将提供一个三元表达式。我们的任务是根据可能的各种路径(选择),以二叉树的形式转换给定的表达式。 示例 输出结果

  • 我目前正在研究N进制树,我偶然发现了级序遍历。理论上看起来很简单,在代码上运行并不困难,但是现在我想把它升级并添加递归,这样我就可以更好地理解它。问题是我现在发现很难这样做。这是我的代码: 是否有一种有效的方法,或者递归地运行这种级别顺序遍历方法是否有意义? 这是一些更改后的级别订单代码 它在调用collectNodes的行上给出错误。 这就是collectNodes()的外观。

  • 问题内容: 能够将常规元素临时转换为会非常有用。例如,假设我有一个想要翻转的样式。我想动态创建画布,将其“渲染” 到画布中,隐藏原始元素并为画布设置动画。 能做到吗 问题答案: 抱歉,浏览器无法将HTML渲染到画布中。 如果可能的话,这将带来潜在的安全风险,因为HTML可以包含来自第三方站点的内容(尤其是图像和iframe)。如果可以将HTML内容转换为图像,然后读取图像数据,则有可能从其他站点提

  • (为了避免冗长的解释,我所要寻找的只是java中泛型树(n元树)的级别顺序遍历。提供的代码正常工作,需要级别顺序显示功能。环顾四周一个小时,但找不到通用n元树的参考。如果soemone能帮助我在代码上构建LevelOrderDisplay函数,我将不胜感激,因为它将帮助我理解我遇到的队列错误。谢谢 我一直在尝试在工作中实现Autosys作业计划的树表示。由于每个作业(流程)可以有一个或多个依赖作业

  • 问题内容: 在JavaScript中,我想不出代码来从n个数组(其中m个元素)中生成组合的代码。对于其他语言,我也曾见过类似的问题,但答案包含了我不确定如何翻译的语法或库魔术。 考虑以下数据: 3个数组,其中包含不同数量的元素。我想做的是通过组合每个数组中的一项来获得所有组合。 例如: 等等。 如果数组的数目是固定的,则很容易进行硬编码实现。但是数组的数量可能会有所不同: 任何帮助将非常感激。 问