Come calcolare la profondità di un albero binario di ricerca

voti
13

Vorrei per calcolare la somma delle profondità di ogni nodo di un Binary Search Tree.

Le singole profondità degli elementi non sono già memorizzati.

È pubblicato 09/12/2009 alle 20:32
fonte dall'utente
In altre lingue...                            


10 risposte

voti
3

Per ogni dato albero, il numero di nodi è 1 per la radice più il numero di nodi nel sottoalbero sinistro più il numero di nodi nel sottoalbero destro :)

Dettagli, come assicurandosi che non ci realmente è una sottostruttura a sinistra oa destra, sono "lasciati al lettore".

Risposto il 09/12/2009 a 20:33
fonte dall'utente

voti
17

Qualcosa come questo:

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

E per ottenere la somma delle profondità di ogni bambino:

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);
}

Ora, per una spiegazione si spera informativa nel caso in cui questo è compiti. Contare il numero di nodi è abbastanza semplice. Prima di tutto, se il nodo non è un nodo ( node == null) restituisce 0. Se si tratta di un nodo, in primo luogo conta la sua auto (la 1), più il numero di nodi nel suo sinistro sotto-albero più il numero di nodi in il suo diritto sub-albero. Un altro modo di pensare è che si visita ogni nodo tramite BFS, e aggiungere uno per il conteggio per ogni nodo che si visita.

La somma delle profondità è simile, tranne che invece di aggiungere solo uno per ciascun nodo, il nodo aggiunge la profondità della sua auto. E si sa che la profondità della sua auto, perché suo padre ha detto che. Ogni nodo sa che la profondità del suo bambini sono il proprio profondità più uno, in modo che quando si ottiene la profondità di sinistra e di destra i figli di un nodo, è dire loro la loro profondità è la profondità del nodo corrente più 1.

E ancora, se il nodo non è un nodo, non ha profondità. Quindi, se si desidera che la somma della profondità di tutti i bambini del nodo principale, si passa al nodo principale e la profondità del nodo principale in questo modo:sumDepthOfAllChildren(root, 0)

La ricorsione è molto utile, è solo un modo molto diverso di pensare le cose e vuole pratica per abituarsi ad esso

Risposto il 09/12/2009 a 20:36
fonte dall'utente

voti
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;
}
Risposto il 09/12/2009 a 20:36
fonte dall'utente

voti
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;
}
Risposto il 09/12/2009 a 20:39
fonte dall'utente

voti
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());}
}
Risposto il 09/12/2009 a 20:44
fonte dall'utente

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

    return 1 + getNumberOfNodes(node.left) + getNumberOfNodes(node.right);
}
Risposto il 18/01/2010 a 08:14
fonte dall'utente

voti
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);
}
Risposto il 17/04/2012 a 07:35
fonte dall'utente

voti
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);
    }
}
Risposto il 01/12/2012 a 07:45
fonte dall'utente

voti
-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); 
}
Risposto il 13/05/2015 a 04:37
fonte dall'utente

voti
2

Questa soluzione è ancora più semplice.

public int getHeight(Node root)
{
    if(root!=null)
        return 1+ Math.max(getHeight(root.leftchild),getHeight(root.rightchild));
    else
        return 0;
}
Risposto il 08/08/2016 a 14:51
fonte dall'utente

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