Вычисление высоты двоичного дерева

Мне нужна помощь с теорией вычисления высоты двоичного дерева, как правило, обозначения.

Я прочитал следующую статью:

вычисление высоты двоичного дерева

и одно из сообщений дает следующее обозначение:

height(node) = max(высота (node.Л), высота(узел.R)) + 1

предположим, что у меня есть следующее двоичное дерево:

     10
   /     
  5    30
 /    /   
4  8  28  42

поэтому я вычислите максимальное значение на левом узле (8) и максимальный узел на правом (42), а затем добавьте 1? Я не совсем понимаю, как эта нотация работает, чтобы вычислить высоту дерева.

8 ответов


я попытаюсь объяснить, как работает этот рекурсивный алгоритм:

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)

Итак, если вы хотите рассчитать height(10), вы должны развернуть рекурсию вниз, а затем заменить результаты назад.

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

высота дерева-это длина пути от корня до самого глубокого узла дерева. Вот самый короткий algo, чтобы сделать это

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

знаете ли вы определение высоты узла? Я бы ответил на него как на самое дальнее расстояние до достижимого листа (поэтому все листья имеют высоту 0)...а теперь попробуйте найти высоту каждого узла снизу вверх..это был бы твой Альго..


узнайте корневой узел, а затем найдите самый длинный путь, который u может покрыть(означает максимальное количество узлов, которые вы можете покрыть в этом пути), если вы получили этот путь, проверьте, сколько ветвей или ребер вы покрыли, общее количество филиалов вы покрыли высота дерева


наибольшее количество узлов, которое возможно таким образом, начиная с первого узла (корня) до листового узла, называется высотой дерева. Формула для нахождения высоты дерева h=i (max)+1 , где h-высота, а I-максимальный уровень дерева


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

Повторный Вопрос

несмотря на хорошее введение в рекурсию, я немного удивлен всеми неправильными ответами на высоту двоичного дерева, поэтому я подумал, что предложу правильное решение. Я немного покопался, и на этот вопрос здесь дан правильный ответ:https://stackoverflow.com/a/2597754/5567854.

ссылка

по данным Википедия, "дерево, состоящее только из корня узел имеет высоту 0", а не 1, как состояние других ответов. Поэтому с примером из вопроса:

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

Если 10 был корневым узлом, чтобы найти высоту этого дерева, то высота равна 2, а не 3.

Правильный Код

данное решение является одним из многих возможных решений на языке C...

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

C энтузиасты, не стесняйтесь читать в этой статье:

http://www.csegeek.com/csegeek/view/tutorials/algorithms/trees/tree_part3.php

Я переназначил код C на PHP:

function getTreeHeight($node) {
    if (!isset($node['left']) && !isset($node['right'])) {
        return 0;
    }

    $leftHeight  = getTreeHeight($node['left']);
    $rightHeight = getTreeHeight($node['right']);

    if ($leftHeight > $rightHeight) {
        return $leftHeight + 1;
    } else {
        return $rightHeight + 1;
    }
}

$array = array(
    'value' => 5,
    'left' => array(
        'value' => 2,
        'left' => array(
            'value' => 1,
        ),
        'right' => array(
            'value' => 4
        ),
    ),
    'right' => array(
        'value' => 11,
        'left' => array(
            'value' => 7
        ),
        'right' => array(
            'value' => 23,
            'left' => array(
                'value' => 16
            ),
            'right' => array(
                'value' => 34
            ),
        ),
    )
);

echo getTreeHeight($array); //output 3