2013-03-22 2 views
0

Java의 모든 리프 노드를 검색하는 방법이 있습니까 TreeMap? Java TreeMap의 모든 리프 노드 검색

내가 가지고 TreeMap 등이 내가이 나무의 모든 잎 노드를 얻는 방법

TreeMap<String, FooBar> myTree = new TreeMap<String, FooBar>(new Comparator<String>() { 
    public int compare(String o1, String o2) 
    { 
    int b1 = Integer.parseInt(o1, 2); 
    int b2 = Integer.parseInt(o2, 2); 
    return (b1 > b2 ? 1 : (b1 == b2 ? 0 : -2)); 
    } 
}); 

?

+1

이것은 이해가되지 않습니다. 잎에 저장된 요소는'TreeMap'의 구현이 트리의 균형을 유지하는 방법에 달려 있습니다. 구현 성능을 벤치마킹하려고하십니까? –

+0

나는 그것을하는 방법을 안다. TreeMap에서는 모든 잎이 null입니다. 그래서 당신은 그들을 가지고 있습니다. 가장 아래 엔트리는 리프가 아닙니다. 나도 그렇게 생각해. –

답변

2

이것은 나에게별로 의미가 없습니다. 잎에 저장된 요소는 TreeMap의 구현이 트리의 균형을 유지하는 방법에 따라 다릅니다.

하지만 어떤 이유로 든이 작업을 수행해야한다고 가정 해 봅시다. 이것을 실제로 수행하려면 약간의 해킹이 필요합니다. java.util에 패키지 된 클래스를 작성하여 TreeMap의 패키지 개인 메소드에 액세스 할 수 있습니다.

static final class Entry<K,V> implements Map.Entry<K,V> { 
    K key; 
    V value; 
    Entry<K,V> left = null; 
    Entry<K,V> right = null; 
    Entry<K,V> parent; 
    boolean color = BLACK; 

    .... 

하는 것 같다되지 않습니다

좀 더 파고를 수행 한 후, 나는 JDK의 기본 트리 구현이 레드 - 블랙 트리이며, 그 Entry 구현은 다음과 같이 발견 루트에 도달하는 직접적인 방법. 하지만,이 중 하나를 붙잡을 수 있다면, Entry, 부모를 루트까지 계속 탐색 한 다음 나뭇잎을 얻는 방법을 사용하십시오 (Entry, left == nullright == null). inorder 순회는 정렬 된 순서를 보존합니다.

그러나 다시 말씀 드리 자면, 왜 이렇게하고 싶은지 알 수 없습니다. 또한 Entry을 조사하려면 java.util 패키지에서 처리해야합니다. 하지만 여기에 재미있는 코드가 있습니다. (JVM의 보안 제한 사항을 재정의하지 않으면이 기능을 실행할 수 없습니다.)

+0

이것은 내 자신의 트리 구조를 구현하는 것 이외의 유일한 방법 인 것 같습니다. 이 접근 방식으로 내가 가진 유일한 문제는 다른 컴퓨터에서는 작동하지 않는다는 것입니다. 그러나 어쨌든 이것은 지금 당장 할 것입니다. – 0x56794E

+0

해킹을 목적으로하지 않는 이유를 설명 할 수 있습니까? –

+0

나는 프로젝트의 region-partition 부분에서 일하고있다. 트리의 각 노드는 영역을 나타내며 파티션이 있으면 두 개의 자식을 갖습니다. 지역 R0가 R1과 R2로 나뉘어져 있다고 가정 해 봅시다 (어떤 알고리즘이 왼쪽인지, 어느 것이 올바른 노드인지를 결정하기 위해 비교기에 지정된 다른 알고리즘이 있습니다). 지금 R1이 남아 있다고 가정합니다. 그런 다음 R1이 다시 나눠지면 R3와 R4라는 두 명의 자녀가 생깁니다. 마지막으로 모든 하위 영역 (잎)을 특정 순서로 가져 오려고합니다. – 0x56794E

관련 문제