递归函数中的C ++平衡树/调用顺序

时间:2016-01-08 23:01:30

标签: c++ recursion tree machine-learning tree-balancing

我此刻正在编写CART树的实现,这是机器学习中使用的二叉树。它以递归方式训练,如下面的代码所示:

struct Node
{
    Node * parent;
    Node * left;
    Node * right;
};

void train(Node* node)
{
    //perform training algorithm on node

    train(node->left);
    train(node->right);
}

现在假设我将跟踪迭代次数限制为所选值,例如nTraining=4

然后,通过展开递归函数调用,我希望只有left分支进化。所以前四个电话是:

    train(node);
    train(node->left);
    train(node->left->left);
    train(node->left->left->left);
    //only now train(node->left->left->right); would follow 

它给出了一个看起来像

的完全不平衡的树
          O
         / \
        O   O
       / \
      O   O
     / \
    O   O
   / \
  O   O

有人可以建议一种方法,我可以进一步使用递归训练方法,仍然可以获得平衡树吗?

1 个答案:

答案 0 :(得分:2)

我会说,不要使用递归(DFS)。使用BFS,即队列,因此逐级遍历树:

std::queue<Node*> q;
Node* root;
q.push(root);
for (int i = 0; i < nTraining; ++i) {
    Node* node = q.front();
    q.pop();
    train(node);
    q.push(node->left);
    q.push(node->right);
}