安卓数据结构05-二叉排序树

数据结构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

喜欢请点赞,谢谢!

    原文作者:最爱的火
    原文地址: https://www.jianshu.com/p/eafe2654e12a
    本文转自网络文章,转载此文章仅为分享知识,如有侵权,请联系博主进行删除。
点赞