不重复元素集合Set接口定义如下

public interface Set<E> {void add(E e);boolean contains(E e);void remove(E e);int getSize();boolean isEmpty();}

复杂度分析:

LinkedListSet

import java.util.ArrayList;public class LinkedListSet <E> implements Set<E>{private LinkedList<E> linkedList;public LinkedListSet() {linkedList = new LinkedList<>();}@Overridepublic void add(E e) {if (!linkedList.contains(e)) {linkedList.addFirst(e);}}@Overridepublic boolean contains(E e) {return linkedList.contains(e);}@Overridepublic void remove(E e) {linkedList.removeElement(e);}@Overridepublic int getSize() {return linkedList.getSize();}@Overridepublic boolean isEmpty() {return linkedList.isEmpty();}}
public class LinkedList<E> {private class Node {public E e;public Node next;public Node (E e, Node next) {this.e = e;this.next = next;}public Node (E e) {this(e, null);}public Node () {this(null, null);}}private Node dummyHead;private int size;public LinkedList() {dummyHead = new Node();size = 0;}public int getSize() {return size;}public boolean isEmpty() {return size == 0;}public void add(E e, int index) {if (index < 0 && index >= size)throw new IllegalArgumentException("failed");Node preNode = dummyHead;for (int i = 0; i < index; i++) {preNode = preNode.next;}preNode.next = new Node(e, preNode.next);size++;}public void addFirst(E e) {add(e, 0);}public void addLast(E e) {add(e, size);}public boolean contains(E e) {Node curNode = dummyHead.next;while (curNode != null) {if (curNode.e.equals(e))return true;curNode = curNode.next;}return false;}public E remove(int index) {if (index < 0 && index >= size)throw new IllegalArgumentException("failed");Node preNode = dummyHead;for (int i = 0; i < index; i++) {preNode = preNode.next;}Node tempNode = preNode.next;preNode.next = tempNode.next;tempNode.next = null;size--;return tempNode.e;}public E removeFirst() {return remove(0);}public E removeLast() {return remove(size-1);}public void removeElement(E e) {Node preNode = dummyHead;while (preNode != null) {if (preNode.next.e.equals(e))break;preNode = preNode.next;}if (preNode.next != null) {Node tempNode = preNode.next;preNode.next = tempNode.next;tempNode.next = null;size--;}}@Overridepublic String toString() {StringBuilder res = new StringBuilder();Node curNode = dummyHead.next;while (curNode != null) {res.append(curNode.e + "->");curNode = curNode.next;}res.append("Null");return res.toString();}
}

BSTSet

import java.util.ArrayList;public class BSTSet <E extends Comparable<E>> implements Set<E> {private MyBST<E> myBST;public BSTSet() {myBST = new MyBST<>();}@Overridepublic void add(E e) {myBST.add(e);}@Overridepublic boolean contains(E e) {return myBST.contains(e);}@Overridepublic void remove(E e) {myBST.remove(e);}@Overridepublic int getSize() {return myBST.getSize();}@Overridepublic boolean isEmpty() {return myBST.isEmpty();}
}
import javax.swing.plaf.InsetsUIResource;public class MyBST <E extends Comparable<E>> {private class Node {public E e;public Node left, right;public Node(E e) {this.e = e;this.left = null;this.right = null;}}private Node root;private int size;public MyBST() {this.root = null;this.size = 0;}public void add(E e) {root = add(root, e);}// 返回插入后的根节点private Node add(Node node, E e) {if (node == null) {size++;return new Node(e);}if (e.compareTo(node.e) < 0) {node.left = add(node.left, e);} else if (e.compareTo(node.e) > 0) {node.right = add(node.right, e);}return node;}// 典型的添加错误
//    private void add(Node node, E e) {//        if (node == null) {//            size++;
//            下面这条语句仅仅让node指向了一个新的地址 但是并没有把这个节点与二叉树连接起来
//            node = new Node(e);
//            return;
//        }
//        if (e.compareTo(node.e) < 0)
//            add(node.left, e);
//        if (e.compareTo(node.e) > 0)
//            add(node.right, e);
//    }// preOrder 前序遍历public void preOrder() {preOrder(root);System.out.println("Null");}private void preOrder(Node node) {if (node == null)return;System.out.print(node.e + "->");preOrder(node.left);preOrder(node.right);}// inOrder 中序遍历public void inOrder() {inOrder(root);System.out.println("Null");}private void inOrder(Node node) {if (node == null)return;inOrder(node.left);System.out.print(node.e + "->");inOrder(node.right);}// postOrder 后续遍历public void postOrder() {postOrder(root);System.out.println("Null");}private void postOrder(Node node) {if (node == null)return;postOrder(node.left);postOrder(node.right);System.out.print(node.e + "->");}// 返回当前以node为根的二叉树的最小值public E minimum() {if (size == 0)throw new IllegalArgumentException("BST is empty");return minimum(root).e;}private Node minimum(Node node) {if (node.left == null) {return node;}return minimum(node.left);}public void removeMin() {removeMin(root);}private Node removeMin(Node node) {if (node.left == null) {size--;Node rightNode = node.right;node.right = null;return rightNode;}node.left = removeMin(node.left);return node;}// 返回已node为根的二叉树的最大值public E maximum() {if (size == 0)throw  new IllegalArgumentException("BST is empty");return maximum(root).e;}private Node maximum(Node node) {if (node.right == null)return node;return maximum(node.right);}// 删除最大元素public E removeMax() {E e = maximum();root = removeMax(root);return e;}private Node removeMax(Node node) {if (node.right == null) {size--;Node leftNode = node.left;node.left = null;return leftNode;}node.right = removeMax(node.right);return node;}// 删除任意元素public void remove(E e) {root = remove(root, e);}private Node remove(Node node, E e) {if (node == null)return null;if (e.compareTo(node.e) == 0) {if (node.left == null) {size--;Node rightNode = node.right;node.right = null;return rightNode;} else if (node.right == null) {size--;Node leftNode = node.left;node.left = null;return leftNode;} else {Node precursor = maximum(node.left);precursor.left = removeMax(node.left);precursor.right = node.right;node.left = node.left = null;return precursor;}} else if (e.compareTo(node.e) < 0) {node.left = remove(node.left, e);} else {node.right = remove(node.right, e);}return node;}public boolean contains(E e) {return contains(root, e);}public boolean isEmpty() {return size == 0;}private boolean contains(Node node, E e) {if (node == null) {return false;}if (e.compareTo(node.e) == 0) {return true;}if (e.compareTo(node.e) < 0) {return contains(node.left, e);} else {return contains(node.right, e);}}public int getSize() {return this.size;}}

使用链表(LinkedList) 二叉搜索树(BST) 实现不重复元素集合(Set)相关推荐

  1. ( “树” 之 BST) 109. 有序链表转换二叉搜索树 ——【Leetcode每日一题】

    二叉查找树(BST):根节点大于等于左子树所有节点,小于等于右子树所有节点. 二叉查找树中序遍历有序. 109. 有序链表转换二叉搜索树 给定一个单链表的头节点 head ,其中的元素 按升序排序 , ...

  2. 看动画学算法之:二叉搜索树BST

    文章目录 简介 BST的基本性质 BST的构建 BST的搜索 BST的插入 BST的删除 看动画学算法之:二叉搜索树BST 简介 树是类似于链表的数据结构,和链表的线性结构不同的是,树是具有层次结构的 ...

  3. 阿里开发者招聘节 | 面试题02-04:给定一个二叉搜索树(BST),找到树中第K小的节点

    为帮助开发者们提升面试技能.有机会入职阿里,云栖社区特别制作了这个专辑--阿里巴巴资深技术专家们结合多年的工作.面试经验总结提炼而成的面试真题这一次将陆续放出(面试题官方参考答案将在专辑结束后统一汇总 ...

  4. 109. 有序链表转换二叉搜索树

    链接:109. 有序链表转换二叉搜索树 题解:https://leetcode-cn.com/problems/convert-sorted-list-to-binary-search-tree/so ...

  5. 二叉搜索树BST的学习

    文章目录 二叉搜索树BST 什么是BST? 用BST做什么? 一.BST的特性 BST的特性是什么? 1.[230. 二叉搜索树中第K小的元素](https://leetcode.cn/problem ...

  6. 五.树,二叉树,二叉搜索树(BST)和自平衡二叉搜索树(AVL)

    1.树 树是一种数据结构 比如:目录结构 树是一种可以递归定义的数据结构 树是由n个节点组成的集合: 如果 n=0, 那这是一颗空树 如果 n>0, 那存在1个节点作为树的根节点,其他节点可以分 ...

  7. 二叉搜索树BST红黑树

    二叉搜索树基础知识 提起红黑树咱们肯定要先说说这个二叉搜索树(BST) 二叉搜索树又叫二叉查找树,二叉排序树:它具有以下特点: 如果它的左子树不为空,则左子树上结点的值都小于根结点. 如果它的右子树不 ...

  8. 【数据结构与算法】3.二叉搜索树(BST)、c++代码

    二叉搜索树(BST).c++代码 参考 https://blog.csdn.net/c_living/article/details/81021510

  9. LeetCode(109):有序链表转换二叉搜索树

    Medium! 题目描述: 给定一个单链表,其中的元素按升序排序,将其转换为高度平衡的二叉搜索树. 本题中,一个高度平衡二叉树是指一个二叉树每个节点 的左右两个子树的高度差的绝对值不超过 1. 示例: ...

最新文章

  1. Win7上防火墙开放FTP服务以及ping解决方案
  2. 802.11成帧封装实现(四)
  3. 国内人工玻璃体和日本人工玻璃体的区别
  4. 硒测试中所需的功能和示例
  5. c语言int 转bool_C++代码实现逆波兰式_C 语言
  6. 阿里主管通知我试用期延期……
  7. 安卓应用安全指南 5.3.2 将内部账户添加到账户管理器 规则书
  8. Android Studio Cmake C++ JNI demo
  9. 拓端tecdat|R语言高维数据惩罚回归方法:主成分回归PCR、岭回归、lasso、弹性网络elastic net分析基因数据
  10. 【紫书第六章】链表(list)、栈和双向队列(deque)
  11. matlab·计算机视觉·工具箱
  12. 【聊透SpringMVC】28天肝完阿里面试通关宝典
  13. NTUSER.DAT
  14. arcgis怎么压缩tif文件_pdf文件过大怎么办?3种免费压缩PDF的方法
  15. HTML5前端基础知识
  16. ISO26262道路车辆功能安全标准-(1)适用范围
  17. GM(1,1)灰色预测模型
  18. 安装黑苹果时BIOS的正确设置
  19. 大学老师必备!30余个学术资源网站速收藏(附链接)
  20. Maven项目自动更新/修复Javadoc

热门文章

  1. 使用 Hexo 创建 GitHub Page 博客(一)
  2. 支持向量机之松弛因子与线性支持向量机
  3. mysql数据库创建带横杠的数据库名
  4. 拼多多TOKEN安卓登录方法
  5. Arduino制作温湿度计
  6. 院士报告: 未来智能城市的痛点、突破
  7. 卡巴斯基界面字符全变成方框的解决办法.
  8. 【HTTP协议与网络编程】HTTP概念和消息
  9. foxmail皮肤_Foxmail 6.5正式版 可以换肤发明信片
  10. Excel搭建RFM模型