不重复元素集合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. 编译ceph源码:cython module not found问题的解决
  2. weblogic 的域信任问题
  3. WebStrom如何设置字体?
  4. mfc 找到字符串中字符_[LeetCode] 467. 环绕字符串中唯一的子字符串
  5. php 图片不让下载,php让图片可以下载的方法
  6. 计算机导论123出栈顺序,优·计算机导论复习提纲.doc
  7. 苏宁启动30周年庆:联合近300个品牌启动“超级品牌季”
  8. java写数据库连接_JAVA写简单的数据库连接池
  9. python数据驱动登录_python之数据驱动ddt操作(方法三)
  10. C语言volatile的本质(三十四)
  11. 无论PC还是Mac,都能畅快地使用移动硬盘
  12. 【收山之作】用yourdiary为例 学习KRKR2 XP3加密静态分析
  13. MAC 电脑安装jdk
  14. 极域电子教室解除控制
  15. 外贸营销网站系统开发功能案例制作
  16. 数据结构21:递归可视化(谢尔宾斯基三角形)
  17. js之好玩的特效黑洞粒子效果[1]
  18. 【WINRAR安装和使用教程】常用压缩软件
  19. 张开翅膀,放飞梦想,让光彩无限绽放!
  20. Hantek6022BE 虚拟示波器 (二)方波 采样率 带宽

热门文章

  1. 在linux系统中进行路由探测,如何在Linux操作系统中运行Traceroute命令?
  2. EAV模型 Entity-Attribute-Value
  3. OpenStack(一)——OpenStack的相关概念
  4. 【Android 实现VideoView开始和播放时缓冲监听动画(监听播放状态)】
  5. 隐藏添加删除程序中的程序在控制面板中的“添加/删除程序”项
  6. 关于军棋自动裁判机制的设想
  7. 【HTTP协议与网络编程】HTTP概念和消息
  8. 时空悖论(祖父悖论)
  9. python界面编程pdf_pythongui设计tkinter菜鸟编程pdf电子版下载
  10. SCSS--SCSS 常用属性合集