7
votes

Compter le nombre de nœuds de feuilles dans l'arbre binaire

Je veux compter le non des nœuds de feuilles: Remarque: Impossible d'utiliser une variable de niveau global / de classe I IMPORTEMED après l'algo, et ça marche bien. Mais je veux que la méthode signature soit xxx pré>

Je sais que je peux surcharger des méthds et appeler la méthode 2 args SIG de 1 ARG, mais ne voulez pas Est-ce que quelqu'un suggère une autre méthode? P>

int countLeaves(Node node,int count){
        if(node==null)
            return 0;

        if(node.left==null && node.right==null){
            return 1+count;
        }else{
            int lc = countLeaves(node.left, count);
            int total = countLeaves(node.right, lc);
            return total;
        }
    }


0 commentaires

7 Réponses :


2
votes

remplir ??? code> set vous-même.

int countLeaves(Node node){
    if (node==null)
        return 0;

    if (node.left==null && node.right==null){
        return 1;
    } else {
        int lc = countLeaves(node.left);
        int rc = countLeaves(node.right);
        return ???;
    }
}


0 commentaires

19
votes
int countLeaves(Node node){
  if( node == null )
    return 0;
  if( node.left == null && node.right == null ) {
    return 1;
  } else {
    return countLeaves(node.left) + countLeaves(node.right);
  }
}
You are doing the same thing as before but instead of holding the current count as we go, we simply say return the result of the sum of the left and right node. These in turn recurse down till they hit the basecases.

0 commentaires

5
votes

Vous n'avez pas besoin de passer compter vers le bas de la pile d'appels, uniquement à partir de: xxx


0 commentaires

-2
votes
public int getLeafsCount(BSTNode<T> node, int count) {
    if(node == null || node.getData() == null){
        return count;
    }
    else if(isLeaf(node)){
        return ++count;
    }else{  
        int leafsLeft =  getLeafsCount((BSTNode<T>) node.getLeft(), count);
        int leafsCount = getLeafsCount((BSTNode<T>) node.getRight(), leafsLeft);

        return leafsCount;
    }

}

1 commentaires

Vous devriez éditer votre message précédent au lieu d'en ajouter un nouveau.



3
votes

Nous pouvons appliquer deux approches, l'une est récursive et une autre est itérative (implémentation basée sur la file d'attente). Mais je vais expliquer les deux méthodes.

solution récursive forte> p>

int count_leaf(Node root)
{
int count=0;
  if(root==NULL)
    return 0;

  queue<Node *> myqueue;
  myqueue.push(root);

  while(!myqueue.empty())
{
  Node temp;
   temp=myqueue.top();   //Take the front element of queue 
   myqueue.pop();        //remove the front element of queue
  if(temp->left==NULL && temp->right==NULL)
   count++;
   if(temp->left)
    myqueue.push(temp->left);
   if(temp->right)
   myqueue.push(temp->right);
}
return count;
}


2 commentaires

Merci pour la solution - je l'ai incorporé ici - k2code.blogspot.in/2015/09/... .


Une méthode itérative est bonne pour ma mise en œuvre car je souhaite, à partir de tout nœud donné, combien de gauche S vs. code> droit s. Donc, quand j'ai un déséquilibre, je peux faire pivoter les nœuds.



0
votes

Comme je suis toujours unitaire teste cette mise en œuvre, aucune promesse d'exploitation sans bug n'est faite. S'il existe des problèmes particuliers avec la mise en œuvre, je suis heureux de recevoir les commentaires. Strong>

Initialement, je reçois des résultats favorables: P>

var actLeftCount = CountNode(root, Direction.Left);
var actRightCount = CountNode(root, Direction.Right);


0 commentaires

0
votes

même que dans le premier commentaire. XXX


0 commentaires