단일 링크드 리스트의 헤드 노드 포인터를 받고,
이 리스트를 트리의 좌우 높이가 같은 바이너리 트리로 변환하는 문제
/**
* Definition for singly-linked list.
* struct ListNode {
* int val;
* ListNode *next;
* ListNode() : val(0), next(nullptr) {}
* ListNode(int x) : val(x), next(nullptr) {}
* ListNode(int x, ListNode *next) : val(x), next(next) {}
* };
*/
/**
* Definition for a binary tree node.
* struct TreeNode {
* int val;
* TreeNode *left;
* TreeNode *right;
* TreeNode() : val(0), left(nullptr), right(nullptr) {}
* TreeNode(int x) : val(x), left(nullptr), right(nullptr) {}
* TreeNode(int x, TreeNode *left, TreeNode *right) : val(x), left(left), right(right) {}
* };
*/
class Solution {
public:
TreeNode* sortedListToBST(ListNode* head) {
if (head == nullptr)
{
return nullptr;
}
static vector<ListNode*> nodes(MaximumItem);
ListNode* temp{head};
int index{0};
while (temp != nullptr)
{
nodes[index] = temp;
temp = temp->next;
++index;
}
return DivideAndConquer(0, index - 1, nodes);
}
private:
const int MaximumItem = 20000;
TreeNode* DivideAndConquer(int start, int end, vector<ListNode*>& nodes)
{
if (start == end)
{
return new TreeNode(nodes[start]->val);
}
TreeNode* tree{nullptr};
if (1 < end - start)
{
int middle{((end - start) >> 1) + start};
tree = new TreeNode(nodes[middle]->val);
tree->left = DivideAndConquer(start, middle - 1, nodes);
tree->right = DivideAndConquer(middle + 1, end, nodes);
}
else
{
tree = new TreeNode(nodes[end]->val);
tree->left = DivideAndConquer(start, end - 1, nodes);
}
return tree;
}
};