是否可以将链表转换为二叉搜索树BST。 并且以当前元素的方式在它们之间有一个链接,指向链接列表和BST中的相同
链表:
3 , 5 ,6 ,1, 2 ,0,4
BST:
3
/ \
1 5
/ \ / \
0 2 4 6
当二叉搜索树的当前值指向1时 它也应该指向链表中的1
答案 0 :(得分:0)
当然,您可以在两个数据结构中使用相同的节点。然后,每个节点都有两个链接:#34; linked-list-ness"和他们的两个孩子" BST-ness"。
所以作为一个简单的例子,节点可能包含这样的字段:
class Node {
public Node next, prev; // for the linked list
public Node left, right; // for the BST
// put some data in here too
}
使用这些节点需要一些小心,因为它很容易获得两个数据结构"不同步",例如,如果您从一个节点中删除一个节点但忘记删除它从另一个。然后,也许这就是你想要的。但是其他事情保持不变,例如,如果你在BST中进行旋转,那么你根本不必触摸链接列表字段,类似地,如果你在链表中交换两个节点,那么BST字段根本不受影响。因此,在这些情况下,代码将与您只有一个数据结构的正常节点类型时的代码相同。
当然这个技巧不适用于标准库实现。
答案 1 :(得分:0)
正如哈罗德上面指出的那样,你绝对可以拥有它。正如他也指出的那样,如果您的实现存在允许数据结构不同步的错误,则可能会使它们不同步。
所以,你可以这样做:
//YourBST.java
public class YourBST<T> {
public List<T> toList() { //Convert this to a list }
}
//YourList.java
public class YourList<T> {
public YourBST<T> toBST() { //... }
}
然后,当修改一个或另一个时......只需调用转换方法来设置其他数据结构。
YourBST<String> bst = new YourBST<String>();
YourList<String> list = new YourList<String>();
modify(bst); //modify your BST in some way
list = bst.toList();
modify(list); //modify your List in some way
bst = list.toBST();
编辑:如果你确实希望同一个对象有上/下一个引用以及左/右引用,那么仍然需要像上面描述的Harold那样的节点类。此解决方案只是修复了“不同步”问题。