6
A
回答
11
這應該給你一個平衡樹(在爲O(n)):
- 構建一個節點中間元素在數組中並返回它
(這將是基本情況下的根)。 - 從數組左半部分重複1.將返回值分配給根的左子元素。
- 從數組的右半部分重複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
插入他們的僞隨機順序,就像這裏:
#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;
}
}
相關問題
- 1. C中的二叉樹插入排序
- 2. 插入二叉樹不排序輸入
- 3. 二叉樹插入
- 4. 查找二叉樹
- 5. 二叉樹查找
- 6. 在二叉樹中插入
- 7. 二叉樹 - 插入到非空樹
- 8. 在C++中插入到二叉樹中
- 9. 將元素插入二叉查找樹時出錯
- 10. 有序的二叉樹插入
- 11. 排序二分查找樹
- 12. 查找插入元素到排序後的數組
- 13. 數組的二叉樹:插入數組的錯誤值
- 14. Java將隨機整數插入到二叉搜索樹中
- 15. 排序二叉樹F#
- 16. 二叉樹插入根
- 17. 遞歸二叉樹插入
- 18. 遞歸二叉樹插入
- 19. 插入節點二叉樹
- 20. 二叉樹插入算法
- 21. 二叉樹不插入
- 22. 二叉搜索樹插入
- 23. 查找二叉查找樹的高度
- 24. 插入二叉樹(級別順序)
- 25. 將節點插入二叉搜索樹
- 26. 將二叉樹轉換爲排序數組
- 27. 將二叉樹轉換爲排序數組
- 28. 將二叉樹元素排序到Prolog中的列表中?
- 29. 查找二叉樹高度
- 30. 查找二叉搜索樹
先生,如果沒有對平衡二叉搜索樹的限制,時間複雜度是多少?應該只有O(n)嗎? – laura
我的意思是可以通過給定的排序後的輸入製作傾斜的樹。它的時間複雜度是什麼? – laura
@勞拉它也將需要O(n)來構造一個不平衡的樹。簡單地通過輸入數組一次需要O(n),所以沒有辦法做得比這更好。 – Dukeling