Java中的决策树节点方法

时间:2014-04-04 20:10:21

标签: java algorithm tree

我正在尝试为Decision Tree程序编写节点类。我不确定如何构建一个递归调用自身的构造函数,直到到达所有叶子,以及我需要哪些帮助方法。这是我到目前为止所拥有的。

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

1 个答案:

答案 0 :(得分:0)

您的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 null if语句,而不是进行会触发该操作的调用。

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