void RandomForestImage::normalizeHistograms(const double histogramBias) { treeData.clear(); for (size_t treeNr = 0; treeNr < ensemble.size(); treeNr++) { CURFIL_INFO("normalizing histograms of tree " << treeNr << " with " << ensemble[treeNr]->getTree()->countLeafNodes() << " leaf nodes"); ensemble[treeNr]->normalizeHistograms(histogramBias); treeData.push_back(convertTree(ensemble[treeNr])); } }
/* This function changes a tree to to hold children sum property */ void convertTree(struct node* node) { int left_data = 0, right_data = 0, diff; /* If tree is empty or it's a leaf node then return true */ if (node == NULL || (node->left == NULL && node->right == NULL)) return; else { /* convert left and right subtrees */ convertTree(node->left); convertTree(node->right); /* If left child is not present then 0 is used as data of left child */ if (node->left != NULL) left_data = node->left->data; /* If right child is not present then 0 is used as data of right child */ if (node->right != NULL) right_data = node->right->data; /* get the diff of node's data and children sum */ diff = left_data + right_data - node->data; /* If node's children sum is greater than the node's data */ if (diff > 0) node->data = node->data + diff; /* THIS IS TRICKY --> If node's data is greater than children sum, then increment subtree by diff */ if (diff < 0) increment(node, -diff); // -diff is used to make diff positive } }
void convertTree(node *root){ if(root == NULL || (!root->left && !root->right)) return; convertTree(root->left); convertTree(root->right); int sum = 0; if(root->left) sum += root->left->data; if(root->right) sum += root->right->data; if(sum > root->data) root->data = sum; else { if(root->left){ root->left->data += root->data - sum; convertTree(root->left); } else { root->right->data += root->data - sum; convertTree(root->right); } } }
int main(){ node *root = newNode(50); root->left = newNode(7); root->right = newNode(2); root->left->left = newNode(3); root->left->right = newNode(5); root->right->left = newNode(1); root->right->right = newNode(30); printf("\n Inorder traversal before conversion "); printInorder(root); convertTree(root); printf("\n Inorder traversal after conversion "); printInorder(root); return 0; }