Comment calculer la profondeur d'un arbre de recherche binaire

voix
13

Je voudrais calculer la somme des profondeurs de chaque noeud d'un arbre de recherche binaire.

Les profondeurs individuelles des éléments ne sont pas déjà stockés.

Créé 09/12/2009 à 20:32
source utilisateur
Dans d'autres langues...                            


10 réponses

voix
3

Pour tout arbre donné, le nombre de noeuds est 1 pour la racine, plus le nombre de nœuds dans le sous-arbre gauche plus le nombre de noeuds dans le sous-arbre droit :)

Détails, comme en vous assurant qu'il fait est un sous - arbre gauche ou à droite, sont « laissés au lecteur ».

Créé 09/12/2009 à 20:33
source utilisateur

voix
17

Quelque chose comme ça:

int countChildren(Node node)
{
    if ( node == null )
        return 0;
    return 1 + countChildren(node.getLeft()) + countChildren(node.getRight());
}

Et pour obtenir la somme des profondeurs de chaque enfant:

int sumDepthOfAllChildren(Node node, int depth)
{
    if ( node == null )
        return 0;  // starting to see a pattern?
    return depth + sumDepthOfAllChildren(node.getLeft(), depth + 1) + 
                   sumDepthOfAllChildren(node.getRight(), depth + 1);
}

Maintenant , pour une explication en cas d' information , espérons - ce est des devoirs. Compter le nombre de nœuds est assez simple. Tout d' abord, si le nœud est pas un noeud ( node == null) renvoie 0. Si elle est un nœud, il compte d' abord son auto (le 1), ainsi que le nombre de nœuds dans son sous-arbre gauche plus le nombre de noeuds son sous-arbre droit. Une autre façon de penser est que vous visitez chaque noeud via BFS, et d' ajouter un au comptage pour chaque nœud que vous visitez.

La somme des profondeurs est similaire, sauf au lieu d'ajouter seulement un pour chaque nœud, le nœud ajoute la profondeur de son auto. Et il connaît la profondeur de son auto parce que son parent a dit qu'il. Chaque nœud sait que la profondeur de c'est les enfants sont sa propre profondeur, plus un, alors quand vous obtenez la profondeur des enfants gauche et à droite d'un nœud, vous leur dire leur profondeur est la profondeur du nœud courant plus 1.

Et encore, si le nœud est pas un nœud, il n'a pas de profondeur. Donc, si vous voulez que la somme de la profondeur de tous les enfants du nœud racine, vous passez dans le nœud racine et la profondeur du nœud racine comme ceci:sumDepthOfAllChildren(root, 0)

La récursivité est très utile, il est juste une façon très différente de penser à des choses et prend la pratique pour s'y habituer

Créé 09/12/2009 à 20:36
source utilisateur

voix
0
public int numberOfNodes()
{
   // This node.
   int result = 1;

   // Plus all the nodes from the left node.
   Node left = getLeft();
   if (left != null)
       result += left.numberOfNodes();

   // Plus all the nodes from the right node.
   Node right = getRight();
   if (right != null)
       result += right.numberOfNodes();

   return result;
}
Créé 09/12/2009 à 20:36
source utilisateur

voix
0
public int countNodes(Node root)
{  
   // Setup
   // assign to temps to avoid double call accessors. 
   Node left = root.getLeft();
   Node right = root.getRight();
   int count = 1; // count THIS node.

   // count subtrees
   if (left != null) count += countNodes(left);
   if (right != null) count += countNodes(right);

   return count;
}
Créé 09/12/2009 à 20:39
source utilisateur

voix
1
public class Node {
   private Node left; 
   private Node right;
   public int size() { return 1+ (left==null?0:left.size())+ (right==null?0:right.size());}
}
Créé 09/12/2009 à 20:44
source utilisateur

voix
2
private static int getNumberOfNodes(Node node) {
    if (node == null) {
        return 0;
    }

    return 1 + getNumberOfNodes(node.left) + getNumberOfNodes(node.right);
}
Créé 18/01/2010 à 08:14
source utilisateur

voix
1
int depth(treenode *p)
{
   if(p==NULL)return(0);
   if(p->left){h1=depth(p->left);}
   if(p=>right){h2=depth(p->right);}
   return(max(h1,h2)+1);
}
Créé 17/04/2012 à 07:35
source utilisateur

voix
11
int maxDepth(Node node) {
    if (node == null) {
        return (-1); // an empty tree  has height −1
    } else {
        // compute the depth of each subtree
        int leftDepth = maxDepth(node.left);
        int rightDepth = maxDepth(node.right);
        // use the larger one
        if (leftDepth > rightDepth )
            return (leftDepth + 1);
        else
            return (rightDepth + 1);
    }
}
Créé 01/12/2012 à 07:45
source utilisateur

voix
-2
public int getDepthHelper( TreeNode< T > node ) { 
    int treeHeightLeft; 
    int treeHeightRight; 
    //get height of left subtree 
    if( node.leftNode == null ) 
        treeHeightLeft = 1; 
    else { 
        treeHeightLeft = getDepthHelper( node.leftNode) + 1; 
    } 

    //get height of right subtree 
    if( node.rightNode == null ) 
        treeHeightRight = 1; 
    else { 
        treeHeightRight = getDepthHelper( node.rightNode) + 1; 
    } 
    return Math.max(treeHeightLeft, treeHeightRight); 
}
Créé 13/05/2015 à 04:37
source utilisateur

voix
2

Cette solution est encore plus simple.

public int getHeight(Node root)
{
    if(root!=null)
        return 1+ Math.max(getHeight(root.leftchild),getHeight(root.rightchild));
    else
        return 0;
}
Créé 08/08/2016 à 14:51
source utilisateur

Cookies help us deliver our services. By using our services, you agree to our use of cookies. Learn more