2012-06-13 2 views
-1

Мне нужна помощь с этой проблемой.Двоичное дерево для цепей

У меня есть двоичная древовидная структура, которая показывает все пути между двумя узлами «1» и «10», как показано на диаграмме. и взаимосвязи между узлом (то есть ребрами) имеют определенные веса.

Теперь кто-нибудь может предложить мне алгоритм или поток, чтобы рассчитать следующее.

Теперь давайте пути от "1" до "10" "а) от 1 до 2 до 3 до 10" "б) от 1 до 2 до 4 до 8 до 10" «с) от 1 до 2 от 4 до 7 до 10 и т. д. »

Теперь способ, которым вычисляются, - это цикл серии/параллельной цепи.

wherevr узловые разветвляется на 2 мне нужно рассчитать сопротивление серии значений

, например, если я просто рассмотреть два пути»а) от 1 до 2 от 3 до 10 и от 1 до 2 до 4 до 8 до 10 «

мы видим, что есть ветка на 2 .. поэтому я добавляю все значения краев от« 2 до 3 до 10 »и« от 2 до 4 до 8 до 10 », а затем умножаю эти две суммы, а затем добавляю значение от «1 до 2», чтобы получить общее значение.

это должно быть сделано по всему дереву .. любые идеи относительно того, как идти о том, чтобы внедрить это в C ??

Изображение можно найти здесь: http://i.stack.imgur.com/PlXiT.png

+0

См http://stackoverflow.com/questions/58306/graph-algorithm-to-find-all-connections-between-two-arbitrary-vertices Ширина первый поиск – eqzx

+0

Как насчет 1-2-4-7 -10? Разве это не изменит результат вашего примера расчета? – jpalecek

+0

yup .. Это был всего лишь пример .. Алго нужно было учитывать все маршруты – rav3451

ответ

1

я понимаю, что вы хотите, чтобы вычислить некоторое эзотерическое значение для дерева, которое определяется на каждом узле с помощью некоторых вычислений на основе значений поддеревьев. Это не так сложно, используя рекурсивную функцию:

struct node { 
    struct node* left, *right; 
    int left_weight, right_weight; /* or something*/ 
}; 

int calculate_it(struct node* root) 
{ 
    /* do the calculation */ 
    if(root->left && root->right) { 
    int l = calculate_it(root->left) + root->left_weight; 
    int r = calculate_it(root->right) + root->right_weight; 
    return l*r; 
    } else if(root->left || root->right) { 
    return root->left ? calculate_it(root->left)+root->left_weight : 
     calculate_it(root->right)+root->right_weight; 
    } 
    return 0; 
} 

Я не уверен, что я понимаю вашу проблему, но это должно дать вам идею.

+0

@jpalecek .. спасибо заглянет в него .. и вернемся к этому .. – rav3451

+0

работает как шарм .. большое спасибо .. – rav3451

Смежные вопросы