查找树

二叉查找/搜索/排序树BST(binary search/sort tree)

二叉排序树可以是空树或具有以下性质的树:

  1. 若它的左子树不为空,则左子树上的所有结点均小于它的根结点
  2. 若它的右子树不为空,则右子树上的所有结点均大于它的根结点
  3. 它的左、右子树也分别为二叉排序树。


注意:对二叉排序树进行遍历,得到有序集合。

平衡二叉树(Self-balancing binary search tree)

自平衡二叉树,又称为AVL树(有别于AVL算法),它可以为一棵空树否则需满足以下性质:

  1. 它的左、右两个子树的高度差(平衡因子)的绝对值不超过1.
  2. 它的左、右两个子树都是平衡二叉树

平衡二叉树一定是二叉搜索树,反之则不一定。
平衡二叉树的目的是为了减少二叉查找树层次,提高查找速度,常用的实现方式有:AVL、红黑树、替罪羊树、Treap、伸展树等。

红黑树(Red-Black Tree)

红黑树是一种平衡二叉树,其每个结点都有存储位表示结点的颜色,可以是红(Red)或黑(Black)。
红黑树具有以下特性:

  1. 每个结点或者是黑色,或者是红色。
  2. 根节点是黑色。
  3. 每个叶子结点(NULL)是黑色。【注意:这里的叶子结点,是指向为空(NULL)的叶子结点】
  4. 如果一个结点是红色,则他的子结点必须是黑色的
  5. 从一个结点到它的子孙结点的所有路径上包含相同数目的黑结点(确保没有一条路径比其他路径长出两倍)。


红黑树的应用比较广泛,主要是用它来存储有序的数据,他的时间复杂度是(log2N),效率非常的高。在Java集合中的TreeSet和TreeMap,Linux虚拟内存的管理,都是通过红黑树实现的。

B树(balanced tree)

B树应文件系统的要求而发展起来(也被称为B-树),大量数据存储在外存中,通常存放在硬盘中,由于海量数据不可能一次性调入内存,因此,要多次访问外存。但硬盘的驱动受机械运动的限制,速度慢。所以,主要矛盾变为减少访问外存的次数。由B树作为索引组织文件,可以提高访问速度,减少访问时间。

B+树

B+树是在B树基础上发展起来的,为叶子结点增加链表指针,所有关键字都在叶子节点中出现,非叶子结节作为叶结节点的索引,B+树总是到叶子结点才能真正访问数据。

数据库的索引的默认数据结构就是采用B+树

B*树

是B+树的变体,在B+树的非根和非叶子结点在增加指向兄弟的指针。

Java中的查找树

Java中的TreeSet的底层使用了TreeMap,其本质都是红黑树。
Java源码中TreeSet的定义:

    public TreeSet() {
        this(new TreeMap<E,Object>());
    }

观察以下代码(平衡二叉树不会形成链式结构):

package com.test;

import java.util.Set;
import java.util.TreeSet;

public class TreeTest {
    public static void main(String[] args) {
        Set<Integer> setA = new TreeSet<Integer>();
        Set<Integer> setB = new TreeSet<Integer>();
        setA.add(3);
        setA.add(1);
        setA.add(5);
        setA.add(4);
        setA.add(2);
        System.out.println(setA);
        setB.add(1);
        setB.add(2);
        setB.add(3);
        setB.add(4);
        setB.add(5);
        System.out.println(setB);
    }
}

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值