Java 在特定深度递归创建二叉树
我想创建一个具有特定深度的二叉树。 到目前为止,我的代码创建二叉树直到达到特定的最大深度,但也创建具有较低最大深度的树。我将在下面说明我的问题 迄今为止我的代码(方法称为Java 在特定深度递归创建二叉树,java,recursion,tree,binary-tree,Java,Recursion,Tree,Binary Tree,我想创建一个具有特定深度的二叉树。 到目前为止,我的代码创建二叉树直到达到特定的最大深度,但也创建具有较低最大深度的树。我将在下面说明我的问题 迄今为止我的代码(方法称为create): 我的代码当前创建的树如上所述,但也包括以下树: (x) (c) (d) (x) (x) (x) 显然,这些不是深度3。我不要这个。我只希望前者没有这些例外 有人能看看我的代码,告诉我我做错了什么,以及如何纠正它吗 最简单的方法是创建一个包装器
create
):
我的代码当前创建的树如上所述,但也包括以下树:
(x) (c) (d)
(x) (x) (x)
显然,这些不是深度3。我不要这个。我只希望前者没有这些例外
有人能看看我的代码,告诉我我做错了什么,以及如何纠正它吗 最简单的方法是创建一个包装器函数,该函数调用您的create tree函数 该函数将创建一个随机自由使用您的函数,测试看看它是否有深度X所需的长度。如果是,它将返回;如果没有,它将再次调用函数,直到找到具有正确深度的树为止。问题是:
random.nextBoolean()
在这方面:
if (depth > 1 && random.nextBoolean())
if (depth > 1 && random.nextBoolean())
您打算使用此语句创建不平衡的树,但这也很有可能创建没有任何最大深度分支的树。您只需要在递归的早期连续返回几次false,就可以得到不想要的结果。考虑到有50%的可能性发生这种情况,它的发生将比你想象的要多!要保证至少有一个分支具有最大深度,您需要进行更多的处理
一个建议是预先确定树中一个或多个将达到最大深度的分支,并将其他分支留给机会。当您使用二叉树时,可以使用布尔:
int depth = 3;
boolean[] branch = new boolean[depth];
for (int i = 0; i < branch.length; i++) {
branch[i] = random.nextBoolean();
}
int-depth=3;
布尔[]分支=新布尔[深度];
对于(int i=0;i
一旦你有了这一点,生成你的树,因为你现在正在做。完成后,按照布尔值[]指示在树中移动,使用true表示左侧,使用false表示右侧。如果您发现某个特定布尔值缺少子对象,并且尚未达到最大深度,请创建该子对象并继续。这不是一种特别有吸引力的方法,但它又便宜又快
一旦这一点起作用,你就可以增加更多的复杂性——更多有保证的分支,以及来自这些分支的额外分支——以充实这棵树。随着最大深度的增加,降低分支终止的可能性可能是明智的,否则,您将得到一个较长的最大深度分支和一堆较小的分支 如前所述,问题出在这一行:
if (depth > 1 && random.nextBoolean())
if (depth > 1 && random.nextBoolean())
你要做的是:
- 控制评估顺序:
考虑
返回新BT(操作符、创建(深度1)、创建(深度1))代码> 将始终首先计算左树,然后计算右树
- 如果其中一棵树已达到所需深度,则让树创建叶子:
为此,我创建了一个布尔变量
finished
private boolean finished;
public BT<E> create(int depth){
if(depth<=0) { // One tree is at desired depth
finished = true;
return new BT<E>(null);
}
if(finished) // Let the other trees set a Leaf.
if(random.nextBoolean())
return new BT<E>(null);
BT<E> temp = create(depth-1); // Control evaluation
if (random.nextBoolean()) // evaluate left and right evenly distributed
return new BT<E>(null, temp, create(depth-1));
else return new BT<E>(null, create(depth-1), temp);
私有布尔完成;
公共BT创建(整数深度){
如果(depth)你对深度的定义与我看到的定义不一致。depth是指从根到叶的最大长度(或边数)。当depth=3时,你所说的树的实际深度为2。
if(finished)
if(random.nextBoolean())
return new BT<E>(null);