ソートされた配列をバイナリ検索ツリーに挿入するアルゴリズムを実装したいが、片側にしか成長しないツリーで終わることは望ましくない。ソートされた配列をバイナリ検索ツリーに挿入する
ご意見はありますか?
ありがとうございました。
ソートされた配列をバイナリ検索ツリーに挿入するアルゴリズムを実装したいが、片側にしか成長しないツリーで終わることは望ましくない。ソートされた配列をバイナリ検索ツリーに挿入する
ご意見はありますか?
ありがとうございました。
をこれはあなたに(O(n)の中に)バランスの取れたツリーを与える必要があります:
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);
}
コード。
ここのように、擬似ランダムな順序でそれらを挿入します。
#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;
}
}
sir、平衡二分探索木の制限がない場合の時間複雑度はどのくらいでしょうか?それはO(n)のみでなければなりませんか? – laura
私は、与えられたソートされた入力によって木を歪めてしまう可能性があります。その時間の複雑さは何ですか? – laura
@lauraまた、不均衡なツリーを構築するためにO(n)が必要です。単に入力配列を通過するとO(n)が必要なので、それ以上のことはできません。 – Dukeling