链接列表和BST之间的当前时间 - java

时间:2015-11-25 08:47:36

标签: java data-structures linked-list binary-search-tree

是否可以将链表转换为二叉搜索树BST。 并且以当前元素的方式在它们之间有一个链接,指向链接列表和BST中的相同

链表:

 3 , 5 ,6 ,1, 2 ,0,4

BST:

     3
   /    \
  1      5
 /  \    / \
0   2   4   6  

当二叉搜索树的当前值指向1时 它也应该指向链表中的1

2 个答案:

答案 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那样的节点类。此解决方案只是修复了“不同步”问题。