数据结构05-二叉排序树

作者: 最爱的火 | 来源:发表于2018-05-08 13:27 被阅读21次

数据结构05-二叉排序树

一、二叉排序树的介绍

二叉排序树 或者是一颗空树,或者是一颗具有如下性质的树:

  1. 若左子树不为空,那么左子树上面的所有节点的关键字值都比根节点的关键字值小;
  2. 若右子树不为空,那么右子树上面的所有节点的关键字值都比根节点的关键字值大;
  3. 左右子树都为二叉树。

二叉排序树的查找效率比一般的二叉树高,但是增删效率低。

二、二叉排序树的实现

1.添加

public void put(E data) {
    Node<E> now = new Node<E>(data);
    if (root == null) {
        root = now;
        return;
    }

    Node<E> parent = root;
    while (parent != null) {
        //小于当前节点,就与左子树比较
        if (data.compareTo(parent.data) < 0) {
            //如果左子节点为空,那就放到左子节点
            if (parent.left == null) {
                parent.left = now;
                now.parent = parent;
                return;
                //如果左子节点不为空,那就继续比较
            } else {
                parent = parent.left;
            }
            //大于当前节点,就放与右子树比较
        } else if (data.compareTo(parent.data) > 0) {
            //如果右子节点为空,那就放到右子节点
            if (parent.right == null) {
                parent.right = now;
                now.parent = parent;
                return;
                //如果右子节点不为空,那就继续比较
            } else {
                parent = parent.right;
            }
        } else {
            return;
        }
    }

}

2.查找

查找是二分查找的思想。

public Node<E> get(E data) {
    if (root == null) {
        return null;
    }
    Node<E> now = root;
    while (now != null) {
        //小于当前节点,就与左子树比较
        if (data.compareTo(now.data) < 0) {
            now = now.left;
            //大于当前节点,就放与右子树比较
        } else if (data.compareTo(now.data) > 0) {
            now = now.right;
            //等于当前节点,就直接返回当前节点
        } else {
            return now;
        }
    }
    return null;
}

3.删除

删除元素:

1.若p有右子树,找到其右子树的最左子节点r,用r来替代p;

2.若p有左子树,没有右子树,找到其左子树的最右子节点l,用l来替代p;

3.若p是叶子节点,则直接删除

public Node<E> remove(E data) {
    Node<E> p = get(data);
    if (p == null) {
        throw new NoSuchElementException();
    }
    //p的右子树的最左子节点r
    Node<E> r = nodeLeft(p.right);
    //p的左子树的最右子节点l
    Node<E> l = nodeRight(p.left);
    if (r != null) {
        p.data = r.data;
        //如果p的右子结点有左节点
        if (r != p.right) {
            r.parent.left = r.right;
        } else {
            p.right = p.right.right;
        }
        r.left = r.right = r.parent = null;
    } else if (l != null) {
        p.data = l.data;
        //如果p的左子结点有右节点
        if (l != p.left) {
            l.parent.right = l.left;
        } else {
            p.left = p.left.left;
        }
        l.left = l.right = l.parent = null;

        //如果p是叶子节点
    } else {
        if (p.parent == null) {
            root = null;
        } else if (p.parent.left == p) {
            p.parent.left = null;
        } else {
            p.parent.right = null;
        }
        p.parent = null;
    }
    return p;
}

最后

代码地址:https://gitee.com/yanhuo2008/Common/blob/master/Tool/src/main/java/gsw/tool/datastructure/tree/TreeBinarySearch.java

数据结构与算法专题:https://www.jianshu.com/nb/25128590

喜欢请点赞,谢谢!

相关文章

  • 数据结构05-二叉排序树

    数据结构05-二叉排序树 一、二叉排序树的介绍 二叉排序树 或者是一颗空树,或者是一颗具有如下性质的树: 若左子...

  • 2018-06-19/20 机试准备09

    数据结构 四、二叉排序树 对二叉排序树进行中序遍历 结果必然是一个递增序列 所以通过建立二叉排序树可以对无序序列进...

  • 彻底弄懂二叉排序树

    彻底弄懂二叉排序树 前言 在之前学习数据结构的时候,就学过二叉排序树,不过,由于但是只是纸上谈兵,虽然知道二叉排序...

  • 数据结构实验之查找一:二叉排序树

    数据结构实验之查找一:二叉排序树 Time Limit: 400MS Memory Limit: 65536KB ...

  • 数据库索引

    索引的本质 索引是帮助MySQL高效获取数据的排好序的数据结构 索引的数据结构 二叉排序树 红黑树(二叉平衡树) ...

  • 哈希算法

    哈希(Hash)或者说散列表,它是一种基础数据结构。Hash 表是一种特殊的数据结构,它同数组、链表以及二叉排序树...

  • iOS标准库中常用数据结构和算法之二叉排序树

    上一篇:iOS标准库中常用数据结构和算法之排序 ?二叉排序树 功能:二叉排序树的标准实现是一颗平衡二叉树。二叉排序...

  • 七、二叉树(八)、二叉排序树

    数据结构目录[https://www.jianshu.com/p/c22b5cb2d79b] 一、定义 二叉排序树...

  • 数据结构题目:树

    数据结构题目:树 题目:二叉排序树的构建与遍历 c++: 转码似乎有点问题,用utf-8就行了 java:

  • MySQL索引原理

    数据结构 二叉排序树(Binary Sort Tree) 规则 若左子树不空,则左子树上所有节点的值均小于它的根节...

网友评论

    本文标题:数据结构05-二叉排序树

    本文链接:https://www.haomeiwen.com/subject/fhnirftx.html