Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/blackberry/2.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
Algorithm 将已排序链接列表转换为二叉搜索树_Algorithm_Binary Tree_Binary Search Tree - Fatal编程技术网

Algorithm 将已排序链接列表转换为二叉搜索树

Algorithm 将已排序链接列表转换为二叉搜索树,algorithm,binary-tree,binary-search-tree,Algorithm,Binary Tree,Binary Search Tree,我试图实现一种算法,将排序后的链接列表转换为BST,但没有得到所需的输出 这是我的功能 public TreeNode linkListToBST(NodeList list) { TreeNode root = linkListToBSTrec(list.getHead(), list.count(list.getHead())); return root; } public TreeNode linkListToBSTrec(Node head, int n) {

我试图实现一种算法,将排序后的链接列表转换为BST,但没有得到所需的输出

这是我的功能

public TreeNode linkListToBST(NodeList list) {
    TreeNode root = linkListToBSTrec(list.getHead(), list.count(list.getHead()));
    return root;
}

public TreeNode linkListToBSTrec(Node head, int n) {
    if (n <= 0) /* base case */
        return null;
    else {
        /* Recursively construct the left subtree */
        TreeNode left = linkListToBSTrec(head, n / 2);
        /*
         * Allocate memory for root, and link the above constructed left
         * subtree with root
         */
        TreeNode root = new TreeNode(head.getData());
        root.setLeft(left);
        head = head.getNext(); /*
                                 * Change head pointer of Linked List for
                                 * parent recursive calls
                                 */
        /*
         * Recursively construct the right subtree and link it with root The
         * number of nodes in right subtree is total nodes - nodes in left
         * subtree - 1 (for root) which is n-n/2-1
         */
        root.setRight(linkListToBSTrec(head, n - (n / 2) - 1));

        return root;
    }
}
输入列表:1->2->3->4->5->6->7->8

级别顺序遍历输出:1->1->2->1->2->2->3->

任何帮助或回答都会非常有用:)

算法来源:


我认为您在错误的位置更改了头部指针。它应该在TreeNode left=linkListToBSTrec(头部,n/2)之前

第一次,你的头和左边都是1。这就是为什么要多次获得相同的数据


我实际上还没有运行这个程序。通过查看,我认为应该更早地更改头部指针。

从排序列表构造平衡BST的正确方法是使用树的头部作为排序列表的中间元素。然后,可以为中间元素左侧的元素递归地构造左子树,类似地,右子树包含中间元素右侧的元素


您正在使用最左边的元素作为根元素,这不是正确的方法。

我相信,您的代码没有表达您的意图


我不熟悉Java,但您希望在函数linkListToBSTrec中传递对节点的引用,否则从左递归调用中更改的head值将不会反映在父函数中。

您看过了吗?是的,我已经用中间指针实现了这个解决方案。问题是
head=head.getNext()
。在递归的第一级,当您确实需要跳转到
6
时,从
1
前进到
2
。顺便说一句,您应该真正了解如何使用调试器:单步执行代码应该会使问题变得明显。@user3386109我认为不需要跳到5(因为我不是使用中间指针实现它)。我正在使用自底向上的方法构建BST。好的,使用调试器逐步检查代码,看看您是否正确。这不会有帮助,也是在第一次,head=1,但left将等于null(叶节点),因为left将被调用,直到n>=0。我正在考虑另一种算法,这里是指向该算法的链接(方法2)geeksforgeks.org/sorted-link-list-to-balanced-bstI在这个方法用C实现的地方添加了一个链接。也许你可以看看并比较一下我遗漏的地方。是的,我已经检查了这个链接。但是,我只知道C++。我对Java一无所知,所以您需要弄清楚如何将引用作为函数参数传递给引用。
TreeNode root = bst.linkListToBST(list);