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

如何在n元树中查找仅叶的父节点

陈俊郎
2023-03-14

我正在尝试解决以下算法:

您有一棵n元树。找到满足以下条件的所有节点:

    < li >该节点有子节点,但所有子节点都是叶节点(它们没有子节点)。返回仅叶父节点的列表及其在树中的深度。

因此,如果我有下面的树,唯一满足上述条件的节点是D,因为它有子节点(E),但它们没有子节点。

  I am root!
     /\ \
    A B  F
      /\
     C  D
         \
         E

我试图在Java中实现这一点,但伪代码也适用于我。我在这里实现了树和节点结构:Java中的N元树。

我需要的只是算法

共有2个答案

呼延德华
2023-03-14

好的,我知道了。这是我得出的解决方案。我确信有更好的解决方案,欢迎你来纠正我。

// kick off the recursion
public Map<Integer, Integer> findLeafOnlyParents(GenericTree<Integer> tree){
        Map<Integer, Integer> resultMap = new HashMap<>();

    // start search from the root
        traverseWithDepth(tree.getRoot(), resultMap, 0);

        return resultMap;
    } 


private void traverseWithDepth(GenericTreeNode<Integer> node,  Map<Integer, Integer> traversalResult, int depth) {

  // check if the current note in the traversal is parent Of leaf-only nodes
  if (isParentOfLeafOnly(node)){
    traversalResult.put(node.data, depth);
  }

  // check the node's children
  for(GenericTreeNode<Integer> child : node.getChildren()) {
    traverseWithDepth(child, traversalResult, depth + 1);
  }

}

// the main logic is here
private boolean isParentOfLeafOnly(GenericTreeNode<Integer> node){
  boolean isParentOfLeafOnly = false;

  // check if the node has children
  if(node.getChildren().size() > 0){

    // check the children of the node - they should not have children
    List<GenericTreeNode<Integer>> children = node.getChildren();
    boolean grandChildrenExist = false; 

    // for each child check if it has children of its own
    for(GenericTreeNode<Integer> child : children) {
      grandChildrenExist = child.getChildren().size() > 0;

      // once found note that the current node has grandchildren,
      // so we don't need to check the rest of the children of the node
      if (grandChildrenExist){
        break;
      }
     }

     // we need only the parents who don't have great children
    isParentOfLeafOnly = !grandChildrenExist;
  }
  return isParentOfLeafOnly;
}
经正祥
2023-03-14

>

  • 从根开始
  • 左子存在时:转到左子
  • 回到父亲身边,检查下一个儿子。
  • 如果没有其他儿子:在列表中插入父亲
  • 否则,将父亲插入列表并转到步骤2,但保留深度计数器,如果找到孙子:从列表中删除父亲
  • 如果完成所有节点:返回列表

    root / \ \ A B F / \ C D \ E

    运行示例:

    • 转到 A
    • 返回根目录并将根目录插入列表
    • 转到 B
    • 转到 C(由于计数器而从电位中删除根)
    • 返回 B 并将 B 添加到列表
    • 转到 D
    • 转到 E(由于计数器而从电位中删除 B)
    • 返回 D 并插入到列表
    • 返回 B
    • 返回根目录
    • 转到 F(不要插入根,因为根已经插入 [并删除]
    • 返回只有 D 的列表

    要使这项工作,你应该为你正在检查的节点运行一个计数器(看看孙子是否存在),并且你也应该有一种方法来知道一个节点是否已经从列表中删除,这样你就不会再插入它了(我没有明确地写它,但我使用了2个列表 - 1个用于潜力,1个用于最终)

  •  类似资料:
    • 问题内容: 我知道这类问题已经在这里多次发布,例如:Java方式 我在标准树模式的数据量庞大(150K +)( , ,) 问题: 如何获取给定node_id的叶子? 表结构: 数据库: 问题答案: 无法在单个查询中执行此操作。即使有,它也可能效率很低。 我们可以通过存储过程和循环来实现。使用添加的索引,它也应该很快。这使用两个表从输入表(A)中选择节点,并将该节点及其子级插入(B)。然后,它将B交

    • 我需要检查节点是否是二叉树中的叶子。这是我当前的代码。 它向我发送了一条错误消息:“HW371937.hs:C:\Users\lenovo\Desktop\���\��� HASKELL\hw371937。hs:(22,1)-(25,91):函数isLeaf中的非穷举模式” 我不知道如何递归地检查下一个节点是否是叶子。任何帮助都将受到感谢。

    • 我有一个树数据结构,其中每个节点可以有任意数量的子节点,树可以是任何高度的。获取树中所有叶节点的最佳方法是什么?有没有可能比遍历树中的每个路径更好,直到我到达叶节点? 在实践中,树的最大深度通常为 5 左右,树中的每个节点将有大约 10 个子节点。 我对其他类型的数据结构或特殊树持开放态度,这将使获取叶节点特别理想。 我正在使用javascript,但实际上只是在寻找一般建议,任何语言等。 谢啦!

    • 我试图想出一个密码查询,可以返回某些父母的孩子节点,其中孩子的父母都是期望的父母。 我在这个控制台上有一个示例数据集:http://console.neo4j.org/?id=nsq8c1 在该示例中,我们有包含父节点的组节点,以及正好有2个父节点的子节点,并且所有组中的所有父节点与每个其他父节点都有一个子节点。现在我想要回父母都在第一组的孩子。 我尝试的示例查询是

    • 我最近正在评估图形数据库或任何其他数据库的一个特定要求: 通过一个查询中节点的直接子节点及其所有直接和间接子节点的聚合属性检索每个节点的前n个子节点的能力。结果应返回正确的层次结构。 实例 < code >每个节点都有一个属性,即它有多少个直接子节点。并且该树不超过8层。假设我想运行整个树的查询,通过每个级别的所有节点,它的前2个子节点有最多的直接和间接子节点。它将为我们提供以下信息: 我想知道是

    • 我遇到了这个问题,似乎在任何地方都找不到解决办法。 给定一个二叉树,其中每个节点都包含一个数字,表示其子树中剩余节点的数量,编写一个函数,返回第n个按顺序遍历的节点。 查找按序遍历的第n个节点相当简单,但如何使用关于左节点数的信息来改进该过程?