Java数据结构系列(1)——自平衡二叉树

1、基本概念

  所谓自平衡二叉树,就是当我们插入或删除元素之后,二叉树的高度会自动调整到最小,这样我们就可以在对数时间内查找二叉树内的元素。

2、定义

TreeSet<Elemtype> set=TreeSet<>();

3、基本函数

set.ceiling(x)    // 取set中大于等于x的最小值,没有就返回空
set.floor(x)      // 取set中小于等于x的最大值,没有就返回空set.size()        // 返回树的大小set.remove()      // 移除树中元素set.add()         // 向树中添加元素

 

4、运用——LeetCode题

题目描述:给定一个整数数组,判断数组中是否有两个不同的索引 i 和 j,使得 nums [i] 和 nums [j] 的差的绝对值最大为 t,并且 i 和 j 之间的差的绝对值最大为 k。

输入: nums = [1,2,3,1], k = 3, t = 0
输出: true

分析:对于这道题,我们最主要的就是运用滑动窗口,然后查找窗口内的值是否满足要求。而对于查找问题,我们使用自平衡二叉树,就可以在对数级别内实现。

算法:用自平衡二叉树保存窗口里面的值。

  • 如果树中大于等于x的最小值s,s<=x+t ,则返回true
  • 如果树中小于等于x的最大值g,x<=g+t ,则返回true
  • 将x存入树中,当树中元素大于窗口大小k,则删除最小进入树中的元素,循环直到结束。
来源:力扣(LeetCode)链接:https://leetcode-cn.com/problems/contains-duplicate-iii著作权归领扣网络所有。商业转载请联系官方授权,非商业转载请注明出处。
public boolean containsNearbyAlmostDuplicate(int[] nums, int k, int t) {
  TreeSet<Integer> set=new  TreeSet<>();
  for(int i=0;i<nums.length;++i){
    Integer s=set.ceiling(nums[i]);
    if(s!=null && s<=nums[i]+t) return true;
    Integer g=set.floor(nums[i]);
    if(s!=null && nums[i]<=g+t) return true;
    set.add(nums[i]);
    if(set.size()>k){
      set.remove(nums[i-k]);
    }
  }
  return false;
}

待续未完...

原文地址:https://www.cnblogs.com/SupremeBoy/p/12309704.html

时间: 2024-10-30 07:46:12

Java数据结构系列(1)——自平衡二叉树的相关文章

java数据结构与算法之平衡二叉树(AVL树)的设计与实现

[版权申明]未经博主同意,不允许转载!(请尊重原创,博主保留追究权) http://blog.csdn.net/javazejian/article/details/53892797 出自[zejian的博客] 关联文章: java数据结构与算法之顺序表与链表设计与实现分析 java数据结构与算法之双链表设计与实现 java数据结构与算法之改良顺序表与双链表类似ArrayList和LinkedList(带Iterator迭代器与fast-fail机制) java数据结构与算法之栈(Stack)设

Java数据结构系列之——树(4):二叉树的中序遍历的递归与非递归实现

package tree.binarytree; import java.util.Stack; /** * 二叉树的中序遍历:递归与非递归实现 * * @author wl * */ public class BiTreeInOrder { // 中序遍历的递归实现 public static void biTreeInOrderByRecursion(BiTreeNode root) { if (root == null) { return; } biTreeInOrderByRecursi

Java数据结构系列之——树(5):二叉树的后序遍历的递归与非递归实现

package tree.binarytree; import java.util.Stack; /** * 二叉树后序遍历的递归与非递归实现 * * @author wl * */ public class BitreePostOrder { // 后序遍历的递归实现 public static void biTreePostOrderByRecursion(BiTreeNode root) { if (root == null) { return; } biTreePostOrderByRe

Java数据结构系列之——树(6):二叉树的层序遍历

package tree.binarytree; import java.util.LinkedList; /** * 层序遍历二叉树 * * @author wl * */ public class PrintFromTopToBotton { public static void printfromtoptobotton(BiTreeNode root) { if (root == null) { return; } LinkedList<BiTreeNode> queue = new L

Java数据结构系列之——树(2):二叉树的实现及其常用操作

package tree.binarytree; public class BiTreeNode { int data; BiTreeNode leftNode; BiTreeNode rightNode; public BiTreeNode(){ leftNode=null; rightNode=null; } public BiTreeNode(int data,BiTreeNode leftNode,BiTreeNode rightNode){ this.data=data; this.l

java数据结构系列之——数组(1)

import javax.management.RuntimeErrorException; public class MyArray { private long array[]; private int elements;//用于记录数组中实际数据的个数 public MyArray(){ array=new long[50];//数组默认长度为50: } public MyArray(int capacity){//设置数组的默认长度 array=new long[capacity]; }

Java数据结构系列之——栈(2):栈的链式存储结构及其操作

package Stack; import LinkList.SinglyLinkList; public class LinkListStack { private SinglyLinkList<Integer> singlyLinkList; /** * 默认构造函数,用于初始化栈 */ public LinkListStack(){ singlyLinkList=new SinglyLinkList<Integer>(); } /* * 压栈操作 */ public void

Java数据结构系列之——树(1):二叉树基本概念及特点小结

度的概念:结点拥有的子树数称为结点的度(degree).度为0的结点称为叶结点(leaf)或者终端结点.度不为0的结点称为非终端结点或者分支结点.除根节点以外,分支结点也称为内部结点.树的度是树内部结点的度的最大值. 树的深度或者高度:结点的层次从根开始定义起,根为第一层,根的孩子为第二层.树中结点的最大层次称为树的深度或者高度. 树的表示法:(1)双亲表示法(2)孩子表示法(3)孩子兄弟表示法 二叉树:二叉树是n(n>=0)个结点的有限集合,该集合或者为空集(称为空二叉树),或者由一个根结点和

Java数据结构系列之——队列(1):队列的顺序存储结构及其实现

package queue.sequencequeue; /** * 队列的定义:队列是只允许在一端进行插入操作,而在另外一端进行删除操作的线性表 * 队列是一种先进先出(First In First Out)的线性表,简称FIFO,允许插 * 入的一端称为队尾,允许删除的一端称为队头 * @author wl * */ public class SequenceQueue { private Object[] elementData;//用数组来保存队列的元素 private int fron