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

标签 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

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

最佳答案

我会说,不要使用递归 (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);
}

关于C++ 递归函数中的平衡树/调用顺序,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/34687515/

相关文章:

c++ - 如何在 C/C++ 中释放数组

c++ - 确认在类构造函数中从文本文件初始化变量

opencv - 基尼杂质,在 opencv 中生长随机树

algorithm - 计算最小可能的树

c++ - boost time_duration 总秒数计算

c++ - 在头文件中使用 `const char thing[] = "foo";`?

haskell - 插入二叉搜索树(仅存储在叶节点的数据)

c# - 递归函数相乘

java - 递归指数法

javascript - 树递归与笛卡尔实现