2013-06-10 4 views
11

Вот изображение того, что должен делать мой код.Рекурсивное двоичное дерево поиска x = изменение (x)

Before Call: 
      +----+ 
      | -9 | 
      +----+ 
     / \ 
     /  \ 
     +----+  +----+ 
     | 3 |  | 15 | 
     +----+  +----+ 
    /  / \ 
    /  /  \ 
+----+  +----+  +----+ 
| 0 |  | 12 |  | 24 | 
+----+  +----+  +----+ 
     / \ 
     /  \ 
     +----+  +----+ 
     | 6 |  | -3 | 
     +----+  +----+ 

After Call: 
      +----+ 
      | -9 | 
      +----+ 
     / \ 
     /  \ 
     +----+  +----+ 
     | 6 |  | 30 | 
     +----+  +----+ 
    /  / \ 
    /  /  \ 
+----+  +----+  +----+ 
| 0 |  | 24 |  | 48 | 
+----+  +----+  +----+ 
     / \ 
     /  \ 
     +----+  +----+ 
     | 12 |  | -3 | 
     +----+  +----+ 

В основном эта проблема требует, чтобы я удвоил все значения данных, превышающие 0, в бинарном дереве целых чисел. Мой код ниже делает это для нескольких значений, но останавливается раньше. Я не уверен, как исправить это рекурсивно. Это то, что мой вывод выглядит для дерева, приведенного выше.

 overallRoot 
     _[-9]_______________ 
     /     \ 
    _[6]     _____[30] 
/    /  \ 
[0]    _[12]   [24] 
       / \ 
       [6]  [-3] 
public void doublePositives() { 
    doublePositives(overallRoot); 
} 

private IntTreeNode doublePositives(IntTreeNode root) { 
    if(root != null) { 
     if(root.data > 0) { 
      root.data = 2* root.data; 
     }else { 
      root.left = doublePositives(root.left); 
      root.right= doublePositives(root.right); 
     } 
    } 
    return root; 
} 
+4

+1 для диаграммы! – arynaq

ответ

4

Вам все равно нужно пересечь дерево, если вы удваиваете узел. Снимите else так, чтобы вы всегда проходили. Кроме того, я извлекал задание, потому что вы не изменяющую структуру дерева:

if(root != null) { 
    if(root.data > 0) { 
     root.data = 2 * root.data; 
    } 
    doublePositives(root.left); 
    doublePositives(root.right); 
} 
+0

Я вижу! Спасибо, я понимаю вопрос сейчас :) – this1lefty

2

Вы не делаете рекурсивных вызовов, когда корень положителен.

Вы делаете рекурсивные вызовы только тогда, когда корень отрицательный. Чтобы исправить это, просто удалите else.

private IntTreeNode doublePositives(IntTreeNode root) { 
    if(root != null) { 
     if(root.data > 0) { 
      root.data = 2* root.data; 
     } 
     root.left = doublePositives(root.left); 
     root.right= doublePositives(root.right); 
    } 
    return root; 
} 
+0

СПАСИБО! я вижу свою ошибку – this1lefty

5

выглядит как логический вопрос - вы будете только двойные значения детей отрицательных узлов:

if(root.data > 0) { 
     root.data = 2* root.data; 
    }else { 
     root.left = doublePositives(root.left); 
     root.right= doublePositives(root.right); 
    } 

Если значение root положительное - вы никогда не получите root.left & root.right. Нечто подобное было бы лучше:

if(root.data > 0) { 
     root.data = 2* root.data; 
    } 
    root.left = doublePositives(root.left); 
    root.right= doublePositives(root.right); 
+0

Я получаю это сейчас спасибо! :) – this1lefty

3

Попробуйте это: Вы делали ошибку в условном операторе. Это должно было быть написано так. Если root имеет данные положительные - сделайте это двойным, roger это! и вне! На следующем шаге, действуйте для левого и правого дочерних узлов.

Дополнительно обратите внимание на это, вам не нужно ничего возвращать (кроме пустоты) в рекурсивной функции doublePositives().

public void iWillDoit() { 
     doublePositives(Root); 
    } 

    private void doublePositives(IntTreeNode root) { 
     if(root != null) { 
      if(root.data > 0) 
      { 
       root.data = 2* root.data; 
      } 
      doublePositives(root.left); 
      doublePositives(root.right);  
     } 
    } 
+0

Спасибо, я понимаю сейчас! – this1lefty

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