2016-12-08 4 views
1

J'essaye de créer un arbre binaire. La seule chose que l'on me donne est le nombre de nœuds dans l'arbre. La première chose qui m'est venue à l'esprit est d'utiliser un index (BFS order) pour garder la trace du nombre total de nœuds, puis utiliser une définition récursive. Voici mon pseudo-code pour le faire.Créer un arbre binaire de taille fixe

N = 10   //binary tree total node count 
i = 0   //global integer 
function() 
    if i > N 
     return True 

    create node i 
    i = i + 1 
    function(i) //left 
    i = i + 1 
    function(i) //right 

-je utiliser une variable globale dans cette définition qui me fait me sentir comme peut-être je viole les règles de récursion. Y at-il une meilleure façon de faire ce que je fais, si c'est le cas, peut-elle être améliorée?

Note: Je pose des questions sur la méthode théorique, pas sur le code.

Modifier: Je viens de réaliser que cette méthode échoue. Je suis ouvert aux suggestions. L'exigence pour cet arbre n'est pas d'ajouter un élément à une profondeur, si la profondeur précédente n'est pas remplie de nœuds (tous les nœuds ont 2 enfants), excusez-moi de ne pas le mentionner auparavant, comme pour la pile que j'ai mentionnée dans les commentaires, cela n'a rien à voir avec la question, juste la façon régulière de parcourir les arbres de façon itérative.

+0

La question ne dit pas que vous devez générer l'arborescence récursivement; Peut-être avez-vous mal compris la question? Comme pour l'arbre généré: il s'agit essentiellement d'une liste chaînée, puisque seuls les enfants restants seront créés. Quant à 'i': votre code n'est pas correct, mais il est déjà à mi-chemin d'une solution sans la variable globale. Vous avez 'function' défini sans paramètre, mais l'utiliser avec' i' comme paramètre ... – Paul

+0

@Paul J'ai choisi d'utiliser la récursivité à des fins d'apprentissage. Mais méthode itérative est également applicable, besoin de définir une pile dans le programme. – Rockybilly

+0

Vous devriez clarifier ce que vous voulez réellement. Surtout: quelles sont les exigences pour l'arbre? Votre algorithme crée un arbre parfaitement fin, à part le fait que l'arbre contienne des nœuds 'N + 1'. Et qu'est-ce que cette question a à voir avec une pile? – Paul

Répondre

1

Un arbre se compose de trois éléments si elle est définie de manière récursive:

  • un noeud racine
  • un sous-arbre gauche, qui est un arbre lui-même
  • un sous-arbre droit, qui est un arbre lui-même

tous ces éléments peuvent être NULL.

Maintenant, nous pouvons distribuer les nombres dans une plage [a, b] dans un arbre de la manière suivante:

  • racine contient (a + b)/2
  • sous-arbre gauche est construit de la gamme [a, (a + b)/2 - 1] récursive
  • sous-arbre droit est construit la plage [(a + b)/2 + 1, b] récursivement

Une plage avec un début plus élevé que la fin peut être consi défini comme vide et aboutit à un noeud NULL. Cette distribution garantit que les sous-arbres gauche et droit diffèrent au maximum d'une taille et que chaque niveau est entièrement rempli, avant qu'un autre niveau ne soit rempli.

.: par exemple

N = 6 
            [0, 5] 

       [0, 1]    2     [3, 5] 

     [0]  1  []    [3]   4   [5] 

[]  0  []      []  3  []  [] 5 [] 

En plus cet algorithme construit un BST (en fait ce essentiellement le « inverse » d'une recherche binaire).Maintenant, pour l'algorithme lui-même:

function(a, b): 
    if b < a: return NULL 

    n = create node (a + b)/2 
    n.left = function(a, (a + b)/2 - 1) 
    n.right = function((a + b)/2 + 1, b) 

    return n 

L'arbre peut être généré en appelant:

function(1, N) 

Sinon tous les autres paramètres a et b devrait fonctionner, où a + N - 1 = b détient. Les deux paramètres représentent la plage (les deux inclus) qui devrait être tenue par l'arbre.

+0

Putain c'est avancé. Y a-t-il un nom pour la méthode que vous avez utilisée, en utilisant deux nombres pour garder une trace de l'index? – Rockybilly

+0

@Rockybilly bien, ces deux chiffres sont juste utilisés pour représenter une gamme. Je doute qu'il y ait un nom spécifique pour cela, car c'est juste une façon de représenter les données. Et cela me vient à l'esprit: j'ai oublié comment appeler la méthode pour créer l'arbre. Je vais éditer – Paul