这不是一个重复的问题。
当我们将排序数组转换为BST时,我们确实从n/2
元素的左部分和右部分得到左和右。而当我们试图转换双链表时,为什么我们从(len-(len/2)-1)
得到正确的结果。
基本上,我想明白为什么会有差别,以及如何向某人解释。
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;
}
这个问题是在最近的一次编码采访中被问到的。 问:给定一个二叉树,写一个程序把它转换成双链表。双链表中的节点按zig-zag级顺序遍历形成的序列排列
这就是我到目前为止的代码(由于递归方面的困难,这并不是太多) 几乎只是将头部指针设置为中间信息(4)
在我的解决方案中,我遇到了一个“None's not have.val”的问题。。。我想知道如何调试它。。。 以下是描述 将BST转换为已排序的循环双链接列表。将左指针和右指针视为双链接列表中上一个和下一个指针的同义词。] 让我们以下面的BST为例,它可能会帮助您更好地理解这个问题:我们希望将这个BST转换为一个循环双链接列表。双链表中的每个节点都有一个前导节点和后继节点。对于循环双链表,第一个元
我刚刚学习了如何创建二进制搜索数据结构,它将用于存储字典中的数千个单词。我遇到的问题是,统计添加和删除数据需要很长时间。通常为199263毫秒或200秒,计算100000个单词。有人告诉我,拥有一棵能够自我平衡的树将提高效率,使操作更快。 我的问题是如何使我的树自动平衡以使其高效。我通过消除重复的单词来使树的高度变短,从而做了一些小小的改进。 如果有人能给我一些建议,告诉我如何使树高效,以及如何在
所以,我一直在研究平衡的二叉查找树。 我谷歌了一下,这是我的发现: 二叉树,其中每个节点的两个子树的深度相差 1 或更小(来自维基百科) 难道就不能把平衡二叉树定义为高度不超过ceil(log(n ^ 1)/log ^ 2)的树吗? 从这个答案来看,提问者似乎已经问了同样的事情,但是公认的答案通过举斐波纳契树的例子拒绝了这个想法。斐波纳契树不是平衡树,对吗?我认为回答者可能会与AVL树中平衡树的定
在上一节中,我们考虑构建一个二叉搜索树。正如我们所学到的,二叉搜索树的性能可以降级到 $$O(n)$$ 的操作,如 get 和 put ,如果树变得不平衡。在本节中,我们将讨论一种特殊类型的二叉搜索树,它自动确保树始终保持平衡。这棵树被称为 AVL树,以其发明人命名:G.M. Adelson-Velskii 和E.M.Landis。 AVL树实现 Map 抽象数据类型就像一个常规的二叉搜索树,唯一