嘿伙计们所以我正在学习编程面试问题,我陷入了困境。
我试图递归地做这个,但我不知道从哪里开始。
这是我到目前为止的算法:
makeTree(head, tail){
nodeMid = list/2
root = nodeMid
root.left = makeTree(head, nodeMid)
root.right = makeTree(nodeMid, tail)
我有正确的想法吗?任何输入都非常感谢。谢谢!
答案 0 :(得分:1)
以下是一些要点:
获取链接列表的中间部分并将其设为root。
左半部分和右半部分递归相同。
到达左半边的中间位置,让它留给根的孩子 在步骤1中创建。
获得右半身的中间位置并使其成为正确的孩子 在步骤1中创建的根。
时间复杂度: O(nLogn)其中 n 是Linked List
中的节点数。
答案 1 :(得分:0)
逻辑
1) Get the Middle of the linked list and make it root.
2) Recursively do same for left half and right half.
a) Get the middle of left half and make it left child of the root
created in step 1.
b) Get the middle of right half and make it right child of the
root created in step 1.
<强>代码强>
public Node bstToDll(Node root ){
if(root!=null){
Node lefthead = bstToDll(root.left); // traverse down to left
Node righthead = bstToDll(root.right); // traverse down to right
Node temp = null;
/*
* lefthead represents head of link list created in left of node
* righthead represents head of link list created in right
* travel to end of left link list and add the current node in end
*/
if(lefthead != null) {
temp = lefthead;
while(temp.next != null){
temp = temp.next;
}
temp.next = root;
}else{
lefthead = root;
}
root.prev = temp;
/*
*set the next node of current root to right head of right list
*/
if(righthead != null){
root.next = righthead;
righthead.prev = root;
}else{
righthead = root;
}
return lefthead;// return left head as the head of the list added with current node
}
return null;
}
但这不是最优化的方式,因为时间复杂度是O(nlogn)。要获得更好的优化解决方案,请查看http://www.geeksforgeeks.org/sorted-linked-list-to-balanced-bst/
答案 2 :(得分:0)
我立刻看到的主要问题,请原谅我,如果我错了,你不会改变每个节点的列表位置。 每次递归调用
makeTree(head, tail){
nodeMid = list/2;
就我在循环中看到的那样,你不会改变列表的哪个部分与递归调用一起。即 你有一系列的整数 myint有(0,1,2,3,4,5,6,7,8,9) 每次调用递归时,它将使用list / 2处的数字无限填充二叉树 你需要在每次调用时更改nodeMid的值,使用你要发送的头/尾变量。
您也不想继续重置根节点。您应该使用“this”运算符来设置您正在查看的当前节点的值。
开始成为您正在查看的数组部分的开头 并结束是该部分的结束。 递归调用就是这样。 你还需要添加递归的边界
在树中创建新节点时,将BST与节点一起使用,左侧和右侧节点将设置为null以开始。你需要创建一个新节点并调用递归。
Node makeTree(int head, int tail){
nodeMid = (head+tail)/2;
this = new Node();
if(head < nodeMid-1)
{
this.left = makeTree(head, nodeMid-1);
}
if(nodeMid < tail)
{
this.right = makeTree(nodeMid, tail);
}
this.setValue(list[nodeMid]);
return this;
}
完成所有递归后,您需要设置当前节点的值并返回该节点以进行创建。 这将递归地将排序的数组转换为二叉搜索树。只需为您的双向链表列出正确的列表编码。
开始递归
root = makeTree(0, list.length());