void flattenHelper(struct TreeNode* root, struct TreeNode **start, struct TreeNode **end){ if (root == NULL) { *start = *end = NULL; return; } struct TreeNode *lstart, *lend, *rstart, *rend; lstart = lend = rstart = rend = NULL; flattenHelper(root->left, &lstart, &lend); flattenHelper(root->right, &rstart, &rend); root->left = NULL; if (lend != NULL) { root->right = lstart; lend->right = rstart; } else { root->right = rstart; } *start = root; if (rend != NULL) { *end = rend; } else if (lend != NULL) { *end = lend; } else { *end = root; } }
std::pair<Node *, Node *> flattenHelper(Node *root) { if (root != NULL) { if (root->left == NULL && root->right == NULL) { return {root, root}; } else { auto left_tree = flattenHelper(root->left); auto right_tree = flattenHelper(root->right); if (left_tree.first == NULL) { root->left = NULL; left_tree.first = root; } else { left_tree.second->right = root; root->left = left_tree.second; } if (right_tree.first == NULL) { root->right = NULL; right_tree.second = root; } else { right_tree.first->left = root; root->right = right_tree.first; } return {left_tree.first, right_tree.second}; } } return {NULL, NULL}; }
void flatten(struct TreeNode* root) { struct TreeNode *start, *end; start = end = NULL; flattenHelper(root, &start, &end); }
Node * flatten(Node *root) { if (root) { return flattenHelper(root).first; } return NULL; }