数据结构05-二进制排序树

电脑杂谈  发布时间:2020-06-15 08:09:26  来源:网络整理

树与二叉树的转换的实现_树与二叉树的转换_二叉排序树 数据结构

二进制排序树是空树或具有以下属性的树:

如果左侧子树不为空,则左侧子树上方所有节点的键值均小于根节点的键值;如果右边的子树不为空,那么右边的子树Keyword值以上的所有节点都大于根节点;左和右子树是二叉树.

树与二叉树的转换的实现_树与二叉树的转换_二叉排序树 数据结构

二叉排序树的搜索效率高于普通二叉树,但是添加和删除的效率较低.

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;
        }
    }
}

树与二叉树的转换的实现_二叉排序树 数据结构_树与二叉树的转换

搜索是二进制搜索的概念.

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;
}

二叉排序树 数据结构_树与二叉树的转换的实现_树与二叉树的转换

删除元素:

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://www.pc-fly.com/a/jisuanjixue/article-245964-1.html

    相关阅读
      发表评论  请自觉遵守互联网相关的政策法规,严禁发布、暴力、反动的言论

      热点图片
      拼命载入中...