2013-10-16 40 views

回答

11

這應該給你一個平衡樹(在爲O(n)):

  1. 構建一個節點中間元素在數組中並返回它
    (這將是基本情況下的根)。
  2. 從數組左半部分重複1.將返回值分配給根的左子元素。
  3. 從數組的右半部分重複1.將返回值分配給根的右側子節點。

類似Java的代碼:從here衍生

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); 
} 

代碼。

+0

先生,如果沒有對平衡二叉搜索樹的限制,時間複雜度是多少?應該只有O(n)嗎? – laura

+0

我的意思是可以通過給定的排序後的輸入製作傾斜的樹。它的時間複雜度是什麼? – laura

+1

@勞拉它也將需要O(n)來構造一個不平衡的樹。簡單地通過輸入數組一次需要O(n),所以沒有辦法做得比這更好。 – Dukeling

0

插入他們的僞隨機順序,就像這裏:

#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; 
    } 
}