2015-07-13 35 views
6

Giả sử tôi có một nút trong cây, làm thế nào tôi có thể nhận được tất cả các nút lá có tổ tiên là nút này? Tôi đã xác định TreeNode như sau:Làm thế nào để có được tất cả các nút lá của cây?

public class TreeNode<T> 
{ 
    /** all children of the node */ 
    private List<TreeNode<T>> children = new ArrayList<TreeNode<T>>(); 
    /** the parent of the node, if the node is root, parent = null */ 
    private TreeNode<T> parent = null; 
    /** the stored data of the node */ 
    private T data = null; 

    /** the method I want to implement */ 
    public Set<TreeNode<T>> getAllLeafNodes() 
    { 
     Set<TreeNode<T>> leafNodes = new HashSet<TreeNode<T>>(); 
     return leafNodes; 
    } 
} 
+1

Tiếp tục đi ngang qua trẻ em và tất cả những trẻ em có danh sách trẻ em trống sẽ được nghỉ? Vấn đề là gì? – SMA

+0

Một nút lá nên có một danh sách trống của trẻ em; vì vậy bạn có thể thực hiện một phương thức isLeaf() trên nút của bạn. Và sau đó bạn sẽ phải kiểm tra đệ quy cho tất cả các nút con của bạn. –

+0

vấn đề được giải quyết, cảm ơn tất cả các bạn – Frank

Trả lời

9

Sử dụng đệ quy.

  • nếu nút chính nó là một chiếc lá, trả lại
  • khác, trả lại tất cả những lá nút con của nó

Something như thế này (không kiểm tra):

public Set<TreeNode<T>> getAllLeafNodes() { 
    Set<TreeNode<T>> leafNodes = new HashSet<TreeNode<T>>(); 
    if (this.children.isEmpty()) { 
     leafNodes.add(this); 
    } else { 
     for (TreeNode<T> child : this.children) { 
      leafNodes.addAll(child.getAllLeafNodes()); 
     } 
    } 
    return leafNodes; 
} 
+0

Phương pháp này sẽ không hoạt động. Tôi đã thử trước đó. Nhưng cảm ơn tất cả các bạn. – Frank

+0

Xin lỗi, nó hoạt động, tôi đã mắc phải một sai lầm nhỏ. Cảm ơn! – Frank

+0

hoạt động hoàn hảo! – Frank

Các vấn đề liên quan