繁体   English   中英

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

[英]C++ balanced tree / call order in recursive function

目前,我正在编写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);
}

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM