Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/321.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 在特定深度递归创建二叉树_Java_Recursion_Tree_Binary Tree - Fatal编程技术网

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);