In Java, a TreeSet
is a part of the java.util
package and implements the NavigableSet
interface, which
extends SortedSet
. Internally, it uses a Red-Black Tree (a self-balancing binary search tree), which ensures that
the elements are always stored in sorted order. A TreeSet
does not allow duplicate elements and does not permit null
values. It is commonly used when you need to maintain a sorted collection, and it provides log-time complexity for basic
operations like adding, removing, and searching elements.
Advantages #
- Sorted Order: Elements are automatically sorted in natural order (or using a custom comparator), which is useful when maintaining sorted data is required.
- Efficient Range Queries: The
TreeSet
supports efficient methods for obtaining subsets, headsets, and tailsets, allowing for quick range-based operations. - Navigable: Offers convenient methods like
first()
,last()
,lower()
, andhigher()
for accessing elements based on their values. - No Duplicates: Ensures that the set contains only unique elements.
- Consistent Performance: Since it is based on a balanced tree, performance remains consistent, even with large data sets.
Disadvantages #
- Slower than HashSet: Operations like add, remove, and search have a time complexity of
O(log n)
, which is slower thanHashSet
, which operates inO(1)
on average. - No Null Elements: Does not permit
null
values, and attempting to add anull
element results in aNullPointerException
. - Higher Memory Overhead: Requires more memory compared to a
HashSet
due to the additional structure ( parent/child pointers and color information) of the red-black tree. - Complexity in Maintaining Order: Maintaining sorted order adds complexity and overhead, making it slower for operations that don’t require ordering.
Time and Space Complexity #
Operation | Time Complexity | Space Complexity |
---|---|---|
Add (add) | O(log n) | O(n) |
Remove (remove) | O(log n) | O(n) |
Contains (contains) | O(log n) | O(n) |
First (first) | O(log n) | O(n) |
Last (last) | O(log n) | O(n) |
HeadSet (headSet) | O(log n) | O(n) |
TailSet (tailSet) | O(log n) | O(n) |
SubSet (subSet) | O(log n) | O(n) |
Examples #
Add Operation
- Time Complexity:
O(log n)
TreeSet<Integer> treeSet = new TreeSet<>(); treeSet.add(10); // [10] treeSet.add(5); // [5, 10] treeSet.add(15); // [5, 15, 10] treeSet.add(20); // [5, 15, 10, 20]
- Time Complexity:
Remove Operation
- Time Complexity:
O(log n)
treeSet.remove(20); // [5, 15, 10]
- Time Complexity:
Contains Operation
- Time Complexity:
O(log n)
treeSet.contains(5); // true
- Time Complexity:
First Operation
- Time Complexity:
O(log n)
treeSet.first(); // 5
- Time Complexity:
Last Operation
- Time Complexity:
O(log n)
treeSet.last(); // 15
- Time Complexity:
HeadSet Operation
- Time Complexity:
O(log n)
treeSet.headSet(10); // [5]
- Time Complexity:
TailSet Operation
- Time Complexity:
O(log n)
treeSet.tailSet(10); // [10, 15]
- Time Complexity:
SubSet Operation
- Time Complexity:
O(log n)
treeSet.subSet(5, 15); // [5, 10]
- Time Complexity: