У меня проблема с отслеживанием overAllRoot, мой код в конце! я сталкиваюсь с бесконечным циклом - PullRequest
0 голосов
/ 08 января 2011

Напишите метод combWith, который может быть добавлен в класс IntTree. Метод принимает другое двоичное дерево целых чисел в качестве параметра и объединяет два дерева в новое третье дерево, которое возвращается. Структура нового дерева должна быть объединением структур двух исходных деревьев. Он должен иметь узел в любом месте, где был узел в любом из исходных деревьев (или в обоих). Узлы нового дерева должны хранить целое число, указывающее, у какого из исходных деревьев был узел в этой позиции (1, если только у первого дерева был узел, 2, если только у второго дерева был узел, 3, если у обоих деревьев был узел ). Например, предположим, что переменные IntTree t1 и t2 были инициализированы и хранят следующие деревья:

t3

               +---+
               | 3 |
           ___ +---+ ___
         /               \
       +---+               +---+
       | 3 |               | 3 |
       +---+               +---+
      /     \             /     \

 +---+     +---+     +---+     +---+
 | 3 |     | 1 |     | 2 |     | 3 |  
+---+      +---+     +---+     +---+
     /               \
 +---+               +---+
 | 1 |               | 2 |
 +---+               +---+

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

public IntTree combineWith(IntTree t2)

{
    IntTree t3 = new IntTree();

    while(this.overallRoot != null && t2.overallRoot!= null)
    {
         t3.overallRoot = new IntTreeNode(3);

        //  for the 3 combination
        if(this.overallRoot.left != null && t2.overallRoot.left != null)
        {
            t3.overallRoot.left = new IntTreeNode(3) ;
        }

         if(this.overallRoot.right != null && t2.overallRoot.right != null)
        {
            t3.overallRoot.right = new IntTreeNode(3) ;
        }

        // for the 1 combination
         if(this.overallRoot.left != null && t2.overallRoot.left == null)
        {
            t3.overallRoot.left = new IntTreeNode(1) ;
        }

         if(this.overallRoot.right != null && t2.overallRoot.right == null)
        {
            t3.overallRoot.right = new IntTreeNode(1) ;
        }


        // for the 2 combination
        if(this.overallRoot.left == null && t2.overallRoot.left != null)
        {
            t3.overallRoot.left = new IntTreeNode(2) ;
        }

         if(this.overallRoot.right == null && t2.overallRoot.right != null)
        {
            t3.overallRoot.right = new IntTreeNode(2) ;
        }




    }
    return t3;
}

1 Ответ

1 голос
/ 08 января 2011

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

this.overallRoot != null && t2.overallRoot!= null

Если это правда, первая итерация цикла, это правдадля каждой итерации цикла (отсюда и ваш бесконечный цикл)!

Поскольку это домашнее задание, я не буду давать прямой ответ, но вы должны рассмотреть повторение по обоим деревьям, где вы сравниваете каждое поддерево.Ваша функция в том виде, в котором она написана, должна адекватно поддерживать базовый вариант, теперь ваша задача будет вызывать рекурсию.

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