Algorithm 将已排序链接列表转换为二叉搜索树
我试图实现一种算法,将排序后的链接列表转换为BST,但没有得到所需的输出 这是我的功能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) {
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);