Tôi muốn triển khai thuật toán chèn các mảng được sắp xếp vào các cây tìm kiếm nhị phân nhưng tôi không muốn kết thúc bằng một cây chỉ phát triển sang một bên.Chèn mảng đã sắp xếp vào cây tìm kiếm nhị phân
Bạn có ý tưởng nào không?
Cảm ơn.
Tôi muốn triển khai thuật toán chèn các mảng được sắp xếp vào các cây tìm kiếm nhị phân nhưng tôi không muốn kết thúc bằng một cây chỉ phát triển sang một bên.Chèn mảng đã sắp xếp vào cây tìm kiếm nhị phân
Bạn có ý tưởng nào không?
Cảm ơn.
này sẽ cho bạn một cây cân bằng (trong thời gian O (n)):
mã Java như:
TreeNode sortedArrayToBST(int arr[], int start, int end) {
if (start > end) return null;
// same as (start+end)/2, avoids overflow.
int mid = start + (end - start)/2;
TreeNode node = new TreeNode(arr[mid]);
node.left = sortedArrayToBST(arr, start, mid-1);
node.right = sortedArrayToBST(arr, mid+1, end);
return node;
}
TreeNode sortedArrayToBST(int arr[]) {
return sortedArrayToBST(arr, 0, arr.length-1);
}
Mã bắt nguồn từ here.
Chèn chúng theo thứ tự giả ngẫu nhiên, giống như ở đây:
#include <stdio.h>
int array[] = {1,2,3,4,5,6,7,8,9,10};
#define COUNT 10
#define STEP 7 /* must be relatively prime wrt COUNT */
#define START 5 /* not important */
int main(void)
{
unsigned idx;
idx=START;
while(1) {
printf("[%u] = %u\n", idx, array[idx]);
// do_insert(array[idx]);
idx = (idx + STEP) % COUNT;
if (idx == START) break;
}
return 0;
}
public class SortedArrayToBST {
public TreeNode sortedArrayToBST(int[] num) {
if (num == null) {
return null;
}
return buildBST(num, 0, num.length - 1);
}
private TreeNode buildBST(int[] num, int start, int end) {
if (start > end) {
return null;
}
int mid = start + (end - start)/2;
TreeNode root = new TreeNode(num[mid]);
TreeNode left = buildBST(num, start, mid - 1);
TreeNode right = buildBST(num, mid + 1, end);
root.left = left;
root.right = right;
return root;
}
}
thưa bạn, điều gì sẽ là thời gian phức tạp nếu không có giới hạn của cây tìm kiếm nhị phân cân bằng? Nó có phải là O (n) không? – laura
i có nghĩa là có thể đã làm cho cây nghiêng bởi đầu vào được sắp xếp nhất định.what sẽ là thời gian phức tạp của nó? – laura
@ laura Nó cũng sẽ lấy O (n) để xây dựng một cây không cân bằng. Đơn giản chỉ cần đi qua mảng đầu vào một lần có O (n), do đó, không có cách nào để làm tốt hơn thế. – Dukeling