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

使用LSTM在Python中预测未来值

这段代码可以预测指定股票的当前日期之前的值,但不能预测…

如何在gensim的word2vec模型中查找双词组的相似性

我有一个word2vec模型,假设我使用的是googl…

dask_xgboost.predict 可以工作但无法显示 – 数据必须是一维的

我试图使用 XGBoost 创建模型。 看起来我成功地…

ML Tuning – Cross Validation in Spark

我在https://spark.apache.org/…

如何在React JS中使用fetch从REST API获取预测

我正在开发一个应用程序,其中Flask REST AP…

如何分析ML.NET中多类分类预测得分数组?

我在ML.NET中创建了一个多类分类项目。该项目可以对…

发表回复

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