Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/369.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 将已排序的双链接列表转换为平衡二叉搜索树?这个递归是如何工作的?_Java_Recursion_Data Structures_Binary Search Tree - Fatal编程技术网

Java 将已排序的双链接列表转换为平衡二叉搜索树?这个递归是如何工作的?

Java 将已排序的双链接列表转换为平衡二叉搜索树?这个递归是如何工作的?,java,recursion,data-structures,binary-search-tree,Java,Recursion,Data Structures,Binary Search Tree,这不是一个重复的问题 当我们将排序数组转换为BST时,我们确实从左部分和右部分的n/2元素中得到左和右。然而,当我们试图转换双链接列表时,为什么我们从(len-(len/2)-1)中得到正确答案 基本上,我想了解为什么会有差异,以及如何向某人解释 有两段代码: 这两个公式正在进行不同的计算 在第一段代码中,start+end/2查找数组中间元素(正在转换的数组部分)的索引 而在第二段代码中,len-(len/2)-1查找列表后半部分的长度。在第二段代码中,当它递归调用ex:total leng

这不是一个重复的问题

当我们将排序数组转换为BST时,我们确实从左部分和右部分的
n/2
元素中得到左和右。然而,当我们试图转换双链接列表时,为什么我们从
(len-(len/2)-1)
中得到正确答案

基本上,我想了解为什么会有差异,以及如何向某人解释

有两段代码:


这两个公式正在进行不同的计算

在第一段代码中,
start+end/2
查找数组中间元素(正在转换的数组部分)的索引


而在第二段代码中,
len-(len/2)-1
查找列表后半部分的长度。

在第二段代码中,当它递归调用ex:total length为7:left n/2,right=len-(len/2)-1时。如何工作。在第二个代码中,长度为7:左半部分的长度为
7/2
=
3
(结果被截断为值为
int
,而不是
float
);右半部分的长度为
7-(7/2)-1
=
3
(7/2=3,与前面一样)。然后我们有两个长度3的一半,加上根:总共7个节点。user3093845,如果你认为我的答案对你有帮助,你能投赞成票,甚至接受我的答案吗。这样你就让别人知道我帮助过你了。@meBean谢谢你的快速回复。很抱歉反应太晚。方法1开始。上周末。下一步是1。07.3.
public static Node buildBalancedBST(List<Node> nodes, int start, int end)
    {
        // base case
        if (start > end) {
            return null;
        }
 
        // find the middle index
        int mid = (start + end) / 2;
 
        // The root node will be node present at the mid index
        Node root = nodes.get(mid);
 
        // recursively construct left and right subtree
        root.prev = buildBalancedBST(nodes, start, mid - 1);
        root.next = buildBalancedBST(nodes, mid + 1, end);
 
        // return root node
        return root;
    }
private ListNode convertDllToBST(int len) {
        if (len == 0) {
            return null;
        }
 
        ListNode left = convertDllToBST(len / 2);
        ListNode root = head;
        root.prev = left;
        head = head.next;
        ListNode right = convertDllToBST(len - (len / 2) - 1);
        root.next = right;
        return root;
    }