获取数组的中间值以创建平衡的BST

时间:2018-05-08 09:14:08

标签: java arrays sorting arraylist binary-search-tree

我试图找到数组的中间元素或索引,然后得到每一半的中间部分,依此类推...... 所以我们说[0,1,2,3,4,5,6,7,8,9,10,11,12,13]

我期待的是7, 3, 1, 0, 2, 5, 4, 6 ...

这样当我从新数组中添加元素时,我最终得到了一个平衡的BST

  • 开始:开始索引(0)
  • end:length - 1
  • nums:要添加的数字列表
  • b:将插入
  • 的树

代码:

 public static BST fillBST(BST b, List<Integer> nums, int start, int end) {
    int mid = (start + end) / 2;
    if (start > end)
        b.insertt(nums.get(mid));
    else {
        fillBST(b, nums, start, mid - 1);
        fillBST(b, nums, mid + 1, end);
     }
     return b;
 }

输出我使用列表[0,31]: 0, 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 21, 22, 23, 24, 25, 26, 27, 28, 29, 30, 31

1 个答案:

答案 0 :(得分:0)

你的递归写得不正确,问题是什么。您应该始终添加mid元素,然后在需要时移动到左右部分。

让我们这样做:

/etc/logrotate.conf

这打印 [7,3,1,0,2,5,4,6,11,9,8,10,13,12]

除了递归条件,你可以看到我计算mid的不同方式。通过计算public static void main(String[] args) { List<Integer> list = Arrays.asList(new Integer[] { 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13 }); List<Integer> res =new ArrayList<>(); fillBST(res, list, 0, list.size() - 1); System.out.println(res); } public static List<Integer> fillBST(List<Integer> b, List<Integer> nums, int start, int end) { int mid = (int)Math.round((1.0 * start + end) / 2); b.add(nums.get(mid)); if (start <= mid - 1) fillBST(b, nums, start, mid - 1); if (end >= mid + 1) fillBST(b, nums, mid + 1, end); return b; } ,您不会对值进行舍入,而是将其截断。因此,在您的情况下,medium元素将变为6而不是7。