代码之家  ›  专栏  ›  技术社区  ›  max

需要找到树中最低的节点

  •  1
  • max  · 技术社区  · 6 年前

    (1)
     |
     +-- (2)
     |    
     +-- (3)
        |
        +-- (4)
        |  
        +-- (5)
             |
             +--(6)
    

    如果我的名单是 [1,2,5,6] ,我希望结果是 [2,6] 因为他们是最低等的后代。

    我有一个节点方法 is_descendant() 需要两个节点,然后返回 True False .

    例如:

    1.is_descendant(2) ---> False
    2.is_descendant(1) ---> True
    6.is_descendant(1) ---> True
    

    我的第一个想法是从列表中的第一个元素开始应用 是\u后代() 方法到其他元素。只要它回来 是的 ,我将从列表中删除另一项-因为它是父节点。

    1 回复  |  直到 6 年前
        1
  •  1
  •   RaffleBuffle    6 年前

    规则似乎是,如果某个节点在列表中,并且其任何子节点都在列表中,则应将该节点从列表中删除。这可以使用相当简单的递归函数来实现。

    一些Java代码可以说明:

    static <E> boolean descendentsIn(Node<E> node, Set<E> nodes)
    {
      boolean descendentsIn = false;
      for(Node<E> n : node.children)
      {
        if(descendentsIn(n, nodes) || nodes.contains(n.e)) 
          descendentsIn = true;
      }
      if(descendentsIn && nodes.contains(node.e)) 
        nodes.remove(node.e);
      return descendentsIn;
    }
    
    static class Node<E>
    {
      E e;
      List<Node<E>> children = new ArrayList<>();
      public Node(E e)
      {
        this.e = e;
      }
    }
    

    测试:

    public static void main(String[] args)
    {
      Node<Integer> root = new Node<>(1);
      root.children.add(new Node<>(2));
      root.children.add(new Node<>(3));
      root.children.get(1).children.add(new Node<>(4));
      root.children.get(1).children.add(new Node<>(5));
      root.children.get(1).children.get(1).children.add(new Node<>(6));
    
      Set<Integer> nodes = new HashSet<>(Arrays.asList(1, 2, 5, 6));
    
      System.out.println("Before: " + nodes);
      descendentsIn(root, nodes);    
      System.out.println("After:  " + nodes);
    }
    

    输出:

    Before: [1, 2, 5, 6]
    After:  [2, 6]