2008-10-10 23 views
12

C dilinde N-ary ağacının düzgün bir şekilde uygulanması nasıl olurdu?N-ary ağaçları C

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

Particulary, ben her bir düğüm örneğin böyle bir önceden tanımlanmış yapı tutan her düğümünde çocukların bir ilişkisiz sayıda olan bir n-li ağacı, kendinden ballancing, uygulamak istediğiniz

+0

N-ary tarafından fanout dereceli N olan bir ağaç mı kastediyorsunuz? Daha fazla, örneğin, kendi kendine dengelenmeyen arama ağacı, trie, B-tree vb. Belirtmeniz gerekir. – ephemient

+0

Haklısınız, biraz daha ayrıntı eklemek için soruyu düzenleyeceğim. Teşekkürler! Ve cevabınız için Matt J'ye de teşekkürler! – mmutilva

cevap

12

birinci geçişte olduğu gibi, sadece bir yapı yaratabilecek bir görev yanı sıra TreeNode s göstergelerinden bir set tutar (en TreeNode diyelim). Bu set ya bir dizi olabilir (N sabit ise) veya bağlı bir liste olabilir (N değişken ise). bağlantılı liste ek yapı beyan etmenizi gerektirecektir fiili çocuğun (ağacın bir parçası) bir TreeNode pointer ile ve listedeki bir sonraki ListNode bir işaretçi (en ListNode denir let) (Listenin sonunda ise null).

Böyle görünebilir:

Herhangi n-li ağaç ikili ağaç olarak temsil edilebilir
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

nereye her düğüm sonraki ilk çocuğa sol işaretçi noktaları ve sağ işaretçi noktaları erkek kardeş.

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

Yani, bu durum geçerli olacaktır:

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

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

Bu teknik pek algoritmalar bir ikili ağaç üzerinde ziyade daha karmaşık bir veri yapısına ifade edilebilir olarak yazmak için basittir avantaja sahiptir .