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);
}
相关文章:
- 以 f() + g() 调用顺序的 C++ 函数
- 如何创建跟踪以显示存在递归的调用顺序
- 析构函数的奇怪调用顺序
- 输入法管理器函数 - 平假名到汉字候选列表 c++ covnersion 的正确调用顺序
- 构造函数的调用顺序
- 模板func和非模板func调用顺序
- C++对返回*this的成员函数的重复调用顺序
- 在C++中,析构函数的调用顺序和成员变量的销毁顺序是什么
- XSetWMProtocols 和 glXCreateContext 在多线程环境中调用顺序
- __attribute__((构造函数)) 调用顺序混淆
- 此代码是否依赖于函数调用顺序未定义的行为
- 如何强制实施析构函数的调用顺序
- C++在递归函数中平衡了树/调用顺序
- 构造调用顺序(C++)
- 无法理解析构函数调用顺序
- 构造函数调用顺序与组合
- 构造函数/析构函数在堆栈上的调用顺序
- 递归到迭代,保留变量和调用顺序
- Qt队列连接中的插槽调用顺序
- visual studio-C++函数调用顺序(boost)-混乱