问题:
难度:media
说明:
给出一个链表,然后将链表元素值处理为一颗高度平衡二分查询树。
题目连接:https://leetcode.com/problems/convert-sorted-list-to-binary-search-tree/
输入范围:
- The number of nodes in
head
is in the range[0, 2 * 104]
. -105 <= Node.val <= 105
输入案例:
Input: head = [-10,-3,0,5,9]
Output: [0,-3,9,-10,null,5]
Explanation: One possible answer is [0,-3,9,-10,null,5], which represents the shown height balanced BST.
我的代码:
毕竟是高度平衡二叉树,如果写成 AVL 也行,但是题目的话也就是水过了就行,先用数组记录一遍链表元素,用二分法,每次将数组中点作为节点,然后平均分配到左右就行了。
Java:
class Solution {
private static int[] arr = new int[2 * (int)Math.pow(10, 4)];
public TreeNode sortedListToBST(ListNode head) {
int len = 0;
ListNode node = head;
while(node != null) {
arr[len ++] = node.val;
node = node.next;
}
return recurtion(arr, 0, len - 1, len);
}
public TreeNode recurtion(int[] arr, int left, int right, int len) {
if(right < left || left >= len || right >= len) return null;
int mid = right + left >> 1;
TreeNode node = new TreeNode(arr[mid]);
TreeNode l = recurtion(arr, left, mid - 1, len);
TreeNode r = recurtion(arr, mid + 1, right, len);
node.left = l;
node.right = r;
return node;
}
}
C++:
static int arr[20000];
class Solution {
public:
TreeNode* sortedListToBST(ListNode* head) {
int len = 0;
ListNode* node = head;
while(node) {
arr[len ++] = node->val;
node = node->next;
}
return recurtion(arr, 0, len - 1, len);
}
TreeNode* recurtion(int* arr, int left, int right, int len) {
if(right < left || left >= len || right >= len) return nullptr;
int mid = left + right >> 1;
TreeNode* node = new TreeNode(arr[mid]);
TreeNode* l = recurtion(arr, left, mid - 1, len);
TreeNode* r = recurtion(arr, mid + 1, right, len);
node->left = l;
node->right = r;
return node;
}
};