0

我现在正在编写一个 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

任何人都可以提出一种我可以进一步使用递归训练方法并仍然获得平衡树的方法吗?

4

1 回答 1

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);
}
于 2016-01-08T23:19:25.217 回答