我此刻正在编写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
有人可以建议一种方法,我可以进一步使用递归训练方法,仍然可以获得平衡树吗?
答案 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);
}