代码之家  ›  专栏  ›  技术社区  ›  Marsilinou Zaky

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

  •  0
  • Marsilinou Zaky  · 技术社区  · 6 年前

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

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

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

    • 开始:开始索引(0)
    • 结束:长度-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 回复  |  直到 6 年前
        1
  •  0
  •   Veselin Davidov    6 年前

    您的递归编写不正确,这就是问题所在。您应该始终添加中间元素,然后根据需要移动到左右部分。

    让我们这样做:

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

    这张照片 [7、3、1、0、2、5、4、6、11、9、8、10、13、12]

    除了递归条件之外,您可以看到我计算mid的不同方式。通过计算它 int mid = (start + end) / 2; 您不会对值进行四舍五入,而是将其截断。因此,在您的示例中,medium元素变为6,而不是7。