【问题标题】:Java TreeMap sorting options?Java TreeMap 排序选项?
【发布时间】:2010-09-25 01:39:23
【问题描述】:

有人告诉我,Java 类 TreeMap 使用了 RB 树的实现。如果是这种情况,如何在 TreeMap 上进行中序、前序和后序树遍历?

或者这是不可能的?

【问题讨论】:

    标签: java binary-tree red-black-tree


    【解决方案1】:

    AFAIK TreeSet/TreeMap 类实际上并没有公开它们的任何内部结构,只是符合 Set/Map 接口。迭代器只保证按升序排列。

    我有点困惑,为什么您要按顺序扫描这些节点,因为这些树的目标不是表示对象之间的关系(例如,数学公式),而只是存储所有对象并检索他们有效地。

    【讨论】:

    • 这是一个理论问题,而不是应用问题。
    • 嗨@Uri,RB Trees 始终保持平衡,无论键插入的顺序如何,对吧?那么假设如果我们以退化的方式将键插入到 TreeMap 中,搜索和插入时间将是 O(log N) 是否正确?
    【解决方案2】:

    使用 Collections 库中实现的 TreeMap 将无法做到这一点。这是Java中Red-Black Tree的实现,您可以查看它。查看printTree() 方法,了解它们如何按排序顺序遍历树。

    /**
     * Print all items.
     */
    public void printTree( ) {
        printTree( header.right );
    }
    
    /**
     * Internal method to print a subtree in sorted order.
     * @param t the node that roots the tree.
     */
    private void printTree( RedBlackNode t ) {
        if( t != nullNode ) {
            printTree( t.left );
            System.out.println( t.element );
            printTree( t.right );
        }
    }
    

    也许您可以编写自己的方法以所有三个顺序遍历树。

    【讨论】:

      【解决方案3】:

      您至少可以使用迭代器和 for each 循环进行中序遍历:

      void inOrderWalk(TreeMap<K,V> treeMap) {
         //this will loop through the values in the map in sorted order (inorder traversal)
         for (Map.Entry<K,V> entry : treeMap.entrySet() {
              V value = entry.getValue();
              K key = entry.getKey()
         }
      }
      

      但是,其他海报是正确的:Java 没有公开任何树机制,因此在此视图中不可能进行预排序或后排序。

      【讨论】:

        猜你喜欢
        • 2022-12-09
        • 2023-03-10
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2022-01-19
        • 1970-01-01
        相关资源
        最近更新 更多