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

我目前正在编写一个CART树的实现,这是一种用于机器学习的二叉树。它按照以下代码所示的方式递归训练:

struct Node{    Node * parent;    Node * left;    Node * right;};void train(Node* node){    //在节点上执行训练算法    train(node->left);    train(node->right);}

现在假设我将训练迭代次数限制为一个选定的值,比如nTraining=4

那么,通过展开递归函数调用,我期望只有left分支会被展开。因此,前四个调用是:

    train(node);    train(node->left);    train(node->left->left);    train(node->left->left->left);    //只有现在才会调用train(node->left->left->right);

这会得到一个完全不平衡的树,看起来像这样:

          O         / \        O   O       / \      O   O     / \    O   O   / \  O   O

请问有没有人能建议一种方法,让我继续使用递归训练方法,同时还能得到一个平衡的树?


回答:

我建议不要使用递归(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);}

Related Posts

L1-L2正则化的不同系数

我想对网络的权重同时应用L1和L2正则化。然而,我找不…

使用scikit-learn的无监督方法将列表分类成不同组别,有没有办法?

我有一系列实例,每个实例都有一份列表,代表它所遵循的不…

f1_score metric in lightgbm

我想使用自定义指标f1_score来训练一个lgb模型…

通过相关系数矩阵进行特征选择

我在测试不同的算法时,如逻辑回归、高斯朴素贝叶斯、随机…

可以将机器学习库用于流式输入和输出吗?

已关闭。此问题需要更加聚焦。目前不接受回答。 想要改进…

在TensorFlow中,queue.dequeue_up_to()方法的用途是什么?

我对这个方法感到非常困惑,特别是当我发现这个令人费解的…

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注