it-swarm.com.de

Berechnung der Höhe eines binären Baums

Ich brauche Hilfe bei der Theorie zur Berechnung der Höhe eines binären Baums, normalerweise der Notation.

Ich habe den folgenden Artikel gelesen:

Berechnung der Höhe eines binären Baums

Und einer der Beiträge gibt folgende Notation:

höhe (Knoten) = max (Höhe (Knoten.L), Höhe (Knoten.R)) + 1

Nehmen wir an, ich habe den folgenden binären Baum:

     10
   /   \  
  5    30
 / \   /  \ 
4  8  28  42

Berechne ich deshalb den max-Wert auf dem linken Knoten (8) und dem max-Knoten auf der rechten Seite (42) und addiere dann 1? Ich verstehe nicht ganz, wie diese Notation funktioniert, um die Höhe des Baumes zu berechnen. 

10
Phorce

Ich werde versuchen zu erklären, wie dieser rekursive Algorithmus funktioniert:

height(10) = max(height(5), height(30)) + 1

height(30) = max(height(28), height(42)) + 1
height(42) = 1 (no children)
height(28) = 1 (no children)

height(5) =  max(height(4), height(8)) + 1
height(4) = 1 (no children)
height(8) = 1 (no children)

Wenn Sie also height(10) berechnen möchten, müssen Sie die Rekursion nach unten erweitern und dann die Ergebnisse rückwärts ersetzen.

height(5)  = max(1, 1) + 1
height(30) = max(1, 1) + 1
height(10) = max(2, 2) + 1
height(10) = 3
21
Ondrej Bozek

Die Höhe des Baums ist die Länge des Pfads von der Wurzel bis zum tiefsten Knoten im Baum. Hier ist der kürzeste Algo dazu

int height(Node root){
   if(root == null )
       return 0;
   return 1+max{height(root.left), height(root.right)};
}
20
roger_that

Kennen Sie die Definition der Knotenhöhe? Ich würde es als die am weitesten entfernte Entfernung zu einem erreichbaren Blatt beantworten (also haben alle Blätter Höhe 0) ... jetzt versuchen Sie, die Höhe jedes Knotens von unten nach oben zu ermitteln. 

2
sethi

Finden Sie den Wurzelknoten heraus und suchen Sie nach dem längsten Pfad, den u abdecken kann (bedeutet die maximale Anzahl von Knoten, die Sie in diesem Pfad belegen können). Wenn Sie diesen Pfad erhalten, prüfen Sie, wie viele Äste oder Kanten Sie haben bedeckt haben, Die Gesamtanzahl der Äste, die Sie bedeckt haben, ist die Höhe des Baums

2
Dip686
#include<stdio.h>
#include<stdlib.h>


/* A binary tree node has data, pointer to left child 
   and a pointer to right child */
struct node 
{
    int data;
    struct node* left;
    struct node* right;
};

/* Compute the "maxDepth" of a tree -- the number of 
    nodes along the longest path from the root node 
    down to the farthest leaf node.*/
int maxDepth(struct node* node) 
{
   if (node==NULL) 
       return 0;
   else
   {
       /* compute the depth of each subtree */
       int lDepth = maxDepth(node->left);
       int rDepth = maxDepth(node->right);

       /* use the larger one */
       if (lDepth > rDepth) 
           return(lDepth+1);
       else return(rDepth+1);
   }
} 

/* Helper function that allocates a new node with the
   given data and NULL left and right pointers. */
struct node* newNode(int data) 
{
    struct node* node = (struct node*)
                                malloc(sizeof(struct node));
    node->data = data;
    node->left = NULL;
    node->right = NULL;

    return(node);
}

int main()
{
    struct node *root = newNode(1);

    root->left = newNode(2);
    root->right = newNode(3);
    root->left->left = newNode(4);
    root->left->right = newNode(5); 

    printf("Hight of tree is %d", maxDepth(root));

    getchar();
    return 0;
}
0
sankar

Wiederholte Frage

Trotz der guten Einführungen in die Rekursion bin ich ein bisschen überrascht von all den falschen Antworten bezüglich der Höhe eines binären Baums. Daher dachte ich, ich würde die richtige Lösung anbieten. Ich habe etwas gegraben und diese Frage wird hier richtig beantwortet: https://stackoverflow.com/a/2597754/5567854 .

Referenz

Nach Wikipedia : "Ein Baum, der nur aus einem Wurzelknoten besteht, hat eine Höhe von 0" und nicht 1 als der andere Antwortzustand. Daher mit dem Beispiel aus der Frage:

     10
   /   \  
  5    30
 / \   /  \ 
4  8  28  42

Wenn 10 der Wurzelknoten war, um die Höhe dieses Baums zu ermitteln, ist die Höhe 2 und nicht 3.

Korrekter Code

Diese Lösung ist eine von vielen möglichen Lösungen in C-Sprache ...

size_t binary_tree_height(const binary_tree_t *tree)
{
    size_t r, l, height = 0;

    if (tree)
    {
        r = tree->right ? binary_tree_height(tree->right) + 1 : 0;
        l = tree->left ? binary_tree_height(tree->left) + 1 : 0;
        height += (r > l ? r : l);
    }
    return (height);
}

Die höchste Anzahl von Knoten, die vom ersten Knoten (ROOT) bis zu einem Blattknoten möglich ist, wird als Baumhöhe bezeichnet. Die Formel zum Ermitteln der Höhe eines Baums h = i (max) +1, wobei h die Höhe und I die maximale Höhe des Baums ist

0
safi