2013-10-16 71 views

Trả lời

11

này sẽ cho bạn một cây cân bằng (trong thời gian O (n)):

  1. Xây dựng một nút cho các phần tử trung trong mảng và trả lại
    (đây sẽ là gốc trong trường hợp cơ bản).
  2. Lặp lại từ 1. ở nửa bên trái của mảng, gán giá trị trả lại cho con trái của gốc.
  3. Lặp lại từ 1. ở nửa bên phải của mảng, gán giá trị trả về cho đúng con của thư mục gốc.

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.

+0

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

+0

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

+1

@ 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

0

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; 
} 
3
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; 
    } 
} 
Các vấn đề liên quan