`
yunchow
  • 浏览: 324208 次
  • 性别: Icon_minigender_1
  • 来自: 南京
社区版块
存档分类
最新评论

TreeSet<T> 简单实现

阅读更多

package com.mypack.ds;

import java.util.Random;

public class TreeSet<T>
{
    
    /**
     * @param args
     */
    public static void main(String[] args)
    {
        // TODO Auto-generated method stub
        TreeSet<Integer> tree = new TreeSet<Integer>();
        for (int i = 0; i < 20; i ++)
        {
            tree.add(new Random().nextInt(100));
        }
        System.out.println(tree);
    }
    
    private Entry<T> root;
    
    private volatile Entry<T> entry;
    
    public TreeSet()
    {
        
    }
    
    public void add(T node)
    {
        if (root == null)
        {
            entry = root;
            final Entry<T> tmp = entry;
            synchronized (TreeSet.class)
            {
                if (tmp == null)
                {
                    root = new Entry<T>(node);
                }
            }
        }
        else
        {
            insertNode(root, node);
        }
    }
    
    public String toString()
    {
        StringBuilder sb = new StringBuilder();
        
        travel(root, sb);
        
        return sb.toString();
    }
    
    void travel(Entry<T> root, StringBuilder sb)
    {
        if (root.left == null)
        {
            sb.append(root.value).append(",");
        }
        else
        {
            travel(root.left, sb);
        }
        sb.append(root.value).append(",");
        if (root.right == null)
        {
            sb.append(root.value).append(",");
        }
        else
        {
            travel(root.right, sb);
        }
    }
    
    synchronized void insertNode(Entry<T> obj, T node)
    {
        Comparable<T> c = (Comparable<T>)node;
        
        // right
        if (c.compareTo(obj.value) > 0)
        {
            if (obj.right != null)
            {
                insertNode(obj.right, node);
            }
            else
            {
                Entry<T> en = new Entry<T>(node);
                obj.right = en;
            }
        }
        // left
        else
        {
            if (obj.left == null)
            {
                Entry<T> en = new Entry<T>(node);
                obj.left = en;
            }
            else
            {
                insertNode(obj.left, node);
            }
        }
    }
    
    static class Entry<T>
    {
        Entry left;
        T value;
        Entry right;
        
        Entry(T value)
        {
            this.value = value;
        }
    }
    
}


0
0
分享到:
评论

相关推荐

    java Comparator 用法 例子

    TreeSet&lt;User&gt; treeSet = new TreeSet&lt;&gt;(Comparator.comparing(User::getAge)); ``` 此外,Comparator还可以通过`thenComparing()`方法进行链式比较,这样可以实现多个条件的排序。例如,如果年龄相同,我们可以...

    如何实现java8 list按照元素的某个字段去重

    Collectors.toCollection(() -&gt; new TreeSet&lt;&gt;(Comparator.comparing(t -&gt; t.getName()))), ArrayList::new )); ``` **方法二:使用自定义的distinctByKey方法去重** Java 8的Stream API中的`distinct()`方法...

    java_树形结构文档

    this.children = new ArrayList&lt;&gt;(); } // Getters and setters for data, parent, and children } ``` 树形结构在许多场景下都非常有用,例如在文件系统中,目录和文件的层次关系就形成了一个树;在计算机科学...

    Java泛型机制的程序演示详解

    在本例中,我们创建了一个自定义的 `LenSort` 类,实现了 `Comparator&lt;String&gt;` 接口。`compare()` 方法接收两个 `String` 参数,并返回一个整数值,根据字符串长度进行比较。使用泛型 `&lt;String&gt;`,我们可以直接将...

    比较器Comparator简单用法

    Comparator&lt;Person&gt; salaryComparator = new Comparator&lt;Person&gt;() { @Override public int compare(Person p1, Person p2) { return Double.compare(p1.getSalary(), p2.getSalary()); } } ``` 在上面的例子中...

    集合与泛型

    - **语法**:定义一个泛型类或接口时,在类名或接口名后加上尖括号`&lt;&gt;`,并在其中指定类型参数,通常使用大写字母如`T`、`E`等表示。例如,`class MyGenericClass&lt;T&gt;`。 - **类型参数使用**:类型参数可以在类或接口...

    个人笔记--Java_API

    - **使用**:`ClassName&lt;String&gt; obj = new ClassName&lt;&gt;();` **2.4 泛型方法** - **定义**:`&lt;T&gt; returnType methodName(...){...}` - **使用**:`methodName&lt;T&gt;(...)` **2.5 泛型接口** - **定义**:`interface...

    Java面试题.doc,Java面试题.doc

    泛型可以用在类、接口和方法上,例如 ArrayList&lt;T&gt;、List&lt;String&gt; 和泛型方法 `&lt;T&gt; void foo(T t)`。 以上就是针对 Java 面试题中涉及的一些核心知识点的详细解释,涵盖了基础概念、数据结构、异常处理、多线程、...

    Java-1premierfg (9).zip

    泛型类如`ArrayList&lt;T&gt;`,T代表一个类型参数,可以在使用时指定具体的类型,如`ArrayList&lt;String&gt;`。 【Java注解】 注解(Annotation)是元数据的一种形式,用于提供编译器和JVM有关代码的附加信息。例如,`@...

    java代码-集合类型,返回值为对象时。

    同时,`Collections`工具类提供了多种静态方法,如排序(`sort(List&lt;T&gt; list)`),反转(`reverse(List&lt;T&gt; list)`),查找(`indexOfSubList(List&lt;T&gt; sourceList, List&lt;T&gt; targetList)`等)。 7. **集合与数组的区别**:...

    定义比较器,比较数组中值大小

    List&lt;User&gt; users = ... // 用户列表,User包含name和age属性 users.sort(Comparator.comparing(User::getName).thenComparing(User::getAge)); ``` 通过以上内容,我们了解到定义比较器是实现自定义排序的关键...

    List对象集合的排序:比较器Comparator(简单例子)

    List&lt;Person&gt; persons = new ArrayList&lt;&gt;(); // 添加Person对象... Collections.sort(persons); ``` 上述代码中,`Person`类实现了`Comparable`接口,提供了默认的排序依据(按年龄升序)。如果需要按照其他规则...

    Java集合框架之Collection接口详解

    Collection&lt;String&gt; books = new ArrayList&lt;&gt;(); books.add("红楼梦"); books.add("三国演义"); books.add("西游记"); System.out.println("初始状态:" + books); books.remove("红楼梦"); // 移除元素 System.out....

    算法介绍

    - **树**:如二叉树、平衡树(AVL、红黑树),C#的`System.Collections.Generic.TreeSet&lt;T&gt;`类提供了部分树结构。 6. **递归与分治**: - **递归**:函数调用自身,如阶乘计算、快速排序等。 - **分治**:将大...

    Map、Set、Iterator迭代详解

    List&lt;String&gt; list = new ArrayList&lt;&gt;(); list.add("A"); list.add("B"); list.add("C"); Iterator&lt;String&gt; iterator = list.iterator(); while (iterator.hasNext()) { String element = iterator.next(); ...

    一个java正则表达式工具类源代码.zip(内含Regexp.java文件)

    * \0mnn The character with octal value 0mnn (0 &lt;= m &lt;= 3, 0 &lt;= n &lt;= 7) \0mnn 十进制数 0mnn (0 &lt;= m &lt;= 3, 0 &lt;= n &lt;= 7) * \xhh The character with hexadecimal value 0xhh \xhh 十六进制数 0xhh...

    详解Java中HashSet和TreeSet的区别

    自然排序是根据集合元素的大小,以升序排列,如果要定制排序,应该使用 Comparator 接口,实现 int compare(T o1,T o2) 方法。 总结 1. TreeSet 是二差树实现的,Treeset 中的数据是自动排好序的,不允许放入 null...

    中宇联面试题.doc

    &lt;Title&gt;奥运村进入指南&lt;/Title&gt; &lt;Content&gt;#¥%*&lt;/Content&gt; &lt;/Book&gt; ``` #### 题目七:SQL查询 **问题:** 给定一个表 `table1`,有两个字段,一个是股票编号 `Id`,另一个是股票更新时间 `UpdateTime`,用标准 SQL...

    Java单选.docx

    Box&lt;String&gt; box = new Box&lt;&gt;(); box.set("Hello"); String str = box.get(); // 不需要显式转换 ``` #### 9. Java集合框架高级特性 - **迭代器**:`Iterator`接口用于遍历集合中的元素。 - **枚举类型**:定义...

Global site tag (gtag.js) - Google Analytics