я иметь следующую структуру для представления двоичного дерева:сбалансированное дерево - улучшение
typedef struct node *pnode;
typedef struct node {
int val;
pnode left;
pnode right;
} snode;
Веса дерева является суммой параметра val
из всех узлов дерева. Мы говорим, что дерево сильно сбалансировано, когда оно пустое или вес слева равен весу правого поддерева, и каждое поддерево (слева и справа) сильно сбалансировано. Я должен написать функцию, которая говорит, является ли дерево или не сильно сбалансировано.
Код я написал:
int getWeight(pnode tree)
{
if(! tree)
return 0;
return getWeight(tree->left) + getWeight(tree->right)
+ tree->val;
}
bool isStronglyBalanced(pnode tree)
{
if(! tree)
return true;
int wL, wR;
wL = getWeight(tree->left);
wR = getWeight(tree->right);
if(wL != wR)
return false;
return (isStronglyBalanced(tree->left) && isStronglyBalanced(tree->right));
}
Функция выше делает свою работу очень хорошо, но я заметил это посещение узлы дерева более чем один раз. Может ли быть улучшено (возможно, с помощью динамического программирования), чтобы посещать каждый из узлов дерева только один раз?
Это хороший предложение, но не должно возвращать значение '{balanced && weight_left == weight_right, weight_right + weight_left + tree-> val}'? –
@DougCurrie: Действительно. Благодарю. Исправлено, отмечая, что weight_left == weight_right. – rici