2008-10-10 11 views
12

C 언어로 N 진 트리를 깔끔하게 구현할 수 있습니까?C 언어의 N 진 트리

struct task { 
    char command[MAX_LENGTH]; 
    int required_time; 
}; 
:

Particulary, 나는 각 노드는 예를 들어 다음과 같이 이미 정의 된 구조체를 보유하고있는 각 노드에있는 아이들의 언 바운드 수,과 n 차 나무가 아닌 자기 ballancing을 구현하려는

+0

N-ary는 팬 아웃 정도 N 인 트리를 의미합니까? 너는 더 많은 것을, 예를 들면 자기 균형을 잡는 수색 나무, trie, B 나무, 등등 지정해야한다. – ephemient

+0

맞다, 나는 몇몇 세부 사항을 추가하기 위하여 질문을 편집 할 것이다. 감사! 그리고 Matt J에게도 감사드립니다! – mmutilva

답변

12

첫 번째 패스, 당신은 단순히 구조체을 만들 수있는 작업뿐만 아니라 의 TreeNode의 포인터의 집합을 보유 (의이 TreeNode를를 부르 자). 이 집합은 배열 (N이 고정 인 경우) 또는 연결된 목록 (N이 가변적 인 경우) 중 하나 일 수 있습니다. 링크 된 목록에 추가 구조체를 선언 할 필요 실제 아이 (트리의 일부)에 TreeNode를 포인터 및 목록의 다음 ListNode에 대한 포인터 (의이 ListNode 그것이라고하자) (목록 끝에있는 경우 null).

그것은 다음과 같이 보일 수 있습니다

모든 n 차 트리 이진 트리로 표현 될 수있다
struct task { 
    char command[MAX_LENGTH]; 
    int required_time; 
}; 

struct TreeNode; 

struct ListNode { 
    struct TreeNode * child; 
    struct ListNode * next; 
}; 

struct TreeNode { 
    struct task myTask; 
    struct ListNode myChildList; 
}; 
48

경우 각 노드에서 다음의 첫 번째 자식 왼쪽 포인터 지점 오른쪽 포인터 포인트 동료.

 
      R      R 
     /| \      | 
      B C D      B -- C -- D 
     /\ |      |   | 
     E F G      E -- F G 

그래서, 당신의 경우는 다음과 같습니다

struct task { 
    char command[MAX_LENGTH]; 
    int required_time; 
}; 

struct node { 
    struct task taskinfo; 
    struct node *firstchild; 
    struct node *nextsibling; 
}; 

이 기술은 많은 알고리즘들이 이진 트리보다는 더 복잡한 데이터 구조에 표현 될 수있는 쓸 간단 장점이있다 .