Променете стойността на листата на дърво със сумата на пътя от корена до листа

Трябва да създам функция, която взе дърво, което не е празно, да променя съдържанието на всеки лист в неговото поле, като поставя сумата от стойностите, съдържащи се във възлите на пътя от корена до листа (включително корена и листа).

Така че създадох това:

void sum(BinTree t) {
    while(!t.isLeaf()) {
        sumL += sum(t.left);
        sumR += sum(t.right);
    }
    t.element = ?;
}

boolean isLeaf(BinTree t) {
    return t.left == null && t.right == null;
}

Какво трябва да сложа на мястото на "?"? Не мисля, че функцията е правилна.. Не мога да създам рекурсивни функции за двоичните дървета, намирам ги за много сложни..

Благодаря


РЕДАКТИРАНЕ: Промених метода си:

void leafSum(BinTree t) {
    sumLeaf(root, 0);
}

void leafSum(BinTree t, int tot) {
    if(t->left == NULL && t->right == NULL)
        t->elem = tot;
    else {
        sumLeaf(t->left, tot + t->elem);
        sumLeaf(t->right, tot + t->elem);
    }
}

person Community    schedule 01.06.2015    source източник
comment
Съжалявам, че звуча грубо, но това означава, че трябва да опитате повече и да учите повече. Как вие бихте изпълнили тази задача?   -  person Tassos Bassoukos    schedule 02.06.2015
comment
Вижте тази wiki статия за обхождането на дърво: rosettacode.org/wiki/Tree_traversal#Java Има примери в Java, които можете да копирате и поставяте и трябва да променяте само за математиката. И да, всички примери са рекурсивни. Въпреки че е възможно да се премине през дърво без рекурсия, това широко се смята за грозно решение.   -  person Paul Sasik    schedule 02.06.2015


Отговори (1)


Вместо да предлагам решение, ще дам няколко съвета, които да ви помогнат. Задавайте въпроси, ако нещо не е ясно.

  • Основният алгоритъм, който търсите, е: за всеки възел, ако е лист, запазете сумата, ако не е лист, повторете и за двата дъщерни възела.

  • Докато рекурсията не е от съществено значение, тя ще направи решението по-просто в този случай. Не е сложно: основното правило е винаги да имате условие за прекратяване (във вашия случай, че гледате лист) преди рекурсия.

  • Трябва да предадете текуща сума на функцията, така че да не е необходимо да поглеждате обратно към дървото, след като стигнете до лист. Това не е сложно: просто добавете текущата стойност за възела към текущата обща сума, преди да я съхраните (за листа) или да я предадете на дъщерен възел (за нелиста).

  • Започнете с обща сума от нула, когато извикате функцията за основния възел.

Това е всичко - трябва да можете да измислите решение от тези съвети.

person sprinter    schedule 02.06.2015