我试图为决策树程序编程一个节点类。我不知道如何创建一个递归调用自身的构造函数,直到到达所有叶,以及我需要什么帮助方法。这是我目前所拥有的。

package DecisionTree;

public class DecisionTNode {

    Instance[] a;
    double testValue;
    DTNode left, right;



    public static DTNode sortedArrayToBST(Instance[] num, int start, int end) {
      if (start > end) {
        return null;
      }
      int mid = start + (end-start)/2;
      DTNode root = new DTNode(num.length, num);
      root.left = sortedArrayToBST(num, start, mid-1);
      root.right = sortedArrayToBST(num, mid+1, end);
      return root;
    }
}

最佳答案

您的sortedArrayToBST将递归地创建所有节点。
不需要递归构造函数,只需要一个非常简单的构造函数,它将testValue的值作为参数并对其进行设置。

private DTNode(double data)
{
  testValue = data;
}

并将呼叫更改为:
DTNode root = new DTNode(num[mid].getAttribute());

好吧,那是假设你希望你的课和现在差不多。相反,您可能希望有一个Instance成员并设置它(或者其他什么),但是代码看起来非常相似。
理想的方法是使用generics,但一步一步。
您可以在DecisionTree中调用它(您可能会在其中添加一个DTNode root成员),其内容如下:
root = sortedArrayToBST(instances, 0, instances.length);

如果你想要一个递归构造函数,你可能想用它来替换你的sortedArrayToBST函数-它们看起来非常相似,只需删除DTNode root = ...行并按照上面的建议设置成员变量的值,删除return nullif语句,而不进行会触发它的调用。
public DTNode(Instance[] num, int start, int end)
{
  int mid = start + (end-start)/2;

  // do what you would've done in the constructor
  testValue = num[mid].getAttribute();

  // no 'return null' if statement, instead, prevent the call from ever happening
  //   leaving 'left' / 'right' as 'null' if it doesn't
  if (start <= mid-1)
    left = new DTNode(num, start, mid-1);
  if (mid+1 <= end)
    right = new DTNode(num, mid+1, end);

  // no return statement - constructors can't return anything
}

您可以调用递归构造函数,如下所示:
root = new DTNode(instances, 0, instances.length);

另外,从显示的代码来看,不需要将Instance[] a;作为DTNode的成员。

09-27 23:54