我在跟踪overAllRoot时遇到问题,我的代码就在最后!即将面临无限循环

时间:2011-01-08 19:52:47

标签: java data-structures

编写一个可以添加到IntTree类的方法combineWith。该方法接受另一个整数二叉树作为参数,并将这两棵树组合成一个返回的新的第三棵树。新树的结构应该是两棵原始树的结构的联合。它应该在任何一个原始树(或两者)中都有节点的位置有一个节点。新树的节点应该存储一个整数,指示哪个原始树在该位置有一个节点(如果只有第一棵树有节点,则为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 个答案:

答案 0 :(得分:1)

所以问题的关键在于你是在循环上预期会以某种方式改变的条件,但永远不会改变:

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

如果在循环的第一次迭代中这是真的,那么对于循环的每次迭代都是如此(因此你的无限循环)!

由于这是作业,我不会给出直接的答案,但你应该考虑在两棵树上进行递归,在那里比较每个子树。你写的函数应该充分支持基本情况,现在你的挑战就是调用递归。