簡體   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