编写一个可以添加到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;
}
答案 0 :(得分:1)
所以问题的关键在于你是在循环上预期会以某种方式改变的条件,但永远不会改变:
this.overallRoot != null && t2.overallRoot!= null
如果在循环的第一次迭代中这是真的,那么对于循环的每次迭代都是如此(因此你的无限循环)!
由于这是作业,我不会给出直接的答案,但你应该考虑在两棵树上进行递归,在那里比较每个子树。你写的函数应该充分支持基本情况,现在你的挑战就是调用递归。