Πώς να υπολογίσετε το βάθος ενός δυαδικού δένδρου αναζήτησης

ψήφοι
13

Θα ήθελα να υπολογίσει το άθροισμα των βάθη της κάθε κόμβο ενός Binary Search Tree.

Οι επιμέρους βάθη των στοιχείων δεν είναι ήδη αποθηκευμένο.

Δημοσιεύθηκε 09/12/2009 στις 20:32
πηγή χρήστη
Σε άλλες γλώσσες...                            


10 απαντήσεις

ψήφοι
3

Για οποιαδήποτε δέντρο, ο αριθμός των κόμβων είναι 1 για τη ρίζα συν τον αριθμό των κόμβων στο αριστερό υποδένδρο συν τον αριθμό των κόμβων στο δεξιό υποδέντρο :)

Λεπτομέρειες, όπως φροντίζοντας υπάρχει στην πραγματικότητα είναι μια αριστερή ή δεξιά υποδέντρο, τα «αριστερά προς τον αναγνώστη».

Απαντήθηκε 09/12/2009 στις 20:33
πηγή χρήστη

ψήφοι
17

Κάτι σαν αυτό:

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

Και για να πάρει το άθροισμα των βάθη του κάθε παιδιού:

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

Τώρα για ένα ελπίζουμε ενημερωτική εξήγηση σε περίπτωση που αυτό είναι εργασία. Μετρώντας τον αριθμό των κόμβων είναι αρκετά απλή. Πρώτα απ 'όλα, αν ο κόμβος δεν είναι ένας κόμβος ( node == null) επιστρέφει 0. Αν είναι ένας κόμβος, που μετράει πρώτα τον εαυτό του (ο 1), καθώς και τον αριθμό των κόμβων στο αριστερό υπο-δέντρο της καθώς και τον αριθμό των κόμβων στο δεξιά υπο-δέντρο του. Ένας άλλος τρόπος για να σκεφτώ είναι να επισκεφθείτε κάθε κόμβο μέσω της BFS, και προσθέστε ένα στο μέτρηση για κάθε κόμβο που επισκέπτεστε.

Η άθροιση των βάθη είναι παρόμοια, εκτός από αντί της προσθήκης μόνο ένα για κάθε κόμβο, ο κόμβος προσθέτει το βάθος του εαυτού του. Και γνωρίζει το βάθος του εαυτού του, διότι η μητρική της, είπε. Κάθε κόμβος γνωρίζει ότι το βάθος της είναι τα παιδιά είναι το δικό βάθος συν ένα, έτσι ώστε όταν παίρνετε το βάθος του αριστερού και του δεξιού παιδιά ενός κόμβου, θα τους πω το βάθος τους είναι το βάθος του τρέχοντος κόμβου συν 1.

Και πάλι, αν ο κόμβος δεν είναι ένας κόμβος, δεν έχει βάθος. Έτσι, εάν θέλετε το ποσό του βάθους όλων των παιδιών του κόμβου ρίζας, περνάτε στον κόμβο ρίζα και το βάθος του κόμβου ρίζας όπως έτσι:sumDepthOfAllChildren(root, 0)

Αναδρομή είναι αρκετά χρήσιμη, είναι απλώς ένα πολύ διαφορετικό τρόπο σκέψης για τα πράγματα και χρειάζεται εξάσκηση για να συνηθίσουν σε αυτό

Απαντήθηκε 09/12/2009 στις 20:36
πηγή χρήστη

ψήφοι
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;
}
Απαντήθηκε 09/12/2009 στις 20:36
πηγή χρήστη

ψήφοι
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;
}
Απαντήθηκε 09/12/2009 στις 20:39
πηγή χρήστη

ψήφοι
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());}
}
Απαντήθηκε 09/12/2009 στις 20:44
πηγή χρήστη

ψήφοι
2
private static int getNumberOfNodes(Node node) {
    if (node == null) {
        return 0;
    }

    return 1 + getNumberOfNodes(node.left) + getNumberOfNodes(node.right);
}
Απαντήθηκε 18/01/2010 στις 08:14
πηγή χρήστη

ψήφοι
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);
}
Απαντήθηκε 17/04/2012 στις 07:35
πηγή χρήστη

ψήφοι
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);
    }
}
Απαντήθηκε 01/12/2012 στις 07:45
πηγή χρήστη

ψήφοι
-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); 
}
Απαντήθηκε 13/05/2015 στις 04:37
πηγή χρήστη

ψήφοι
2

Η λύση αυτή είναι ακόμα πιο απλό.

public int getHeight(Node root)
{
    if(root!=null)
        return 1+ Math.max(getHeight(root.leftchild),getHeight(root.rightchild));
    else
        return 0;
}
Απαντήθηκε 08/08/2016 στις 14:51
πηγή χρήστη

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