二叉查找树的元素删除算法

来源:互联网 发布:ubuntu用终端设置中文 编辑:程序博客网 时间:2024/06/06 00:15

BinarySearchTree(BST)删除一个元素稍微有一些复杂,其方法这里做一个总结:

BST的数据结构:

public static class TreeNode<E extends Comparable<E>> {    E element;    TreeNode<E> left;    TreeNode<E> right;    public TreeNode(E e) {        element = e;    }}

算法:删除BST中的一个元素
首先,需要定位包含该元素的结点,及它的父结点。假设current指向二叉树中包含该元素的结点,而parent指向current的父结点。

current可能是parent的左孩子,也可能是右孩子,这里分两种情况:
1. current没有左孩子
这时,只需将该结点的父结点和当前结点的右孩子相连。

如果current.element > parent.element,则parent.right = current,right;

如果current.element  < parent.element,则parent.left = current.right。
2. current有一个左孩子
假设rightMost结点指向current的左子树中最大元素的结点,而parentOfRightMost指向rightMost的父结点。这时,rightMost一定没有右孩子,使current.element = rightMost.element,将rightMost.left连在parentOfRightMost.right上。

如果current的左孩子没有右孩子,那么rightMost = current.left,parentOfRightMost = current,这个时候需要rightMost.left和parentOfRightMost.left相连。

public boolean delete(E e) {        // TODO Auto-generated method stub        TreeNode<E> parent = null;        TreeNode<E> current = root;        while (current != null) {            if (e.compareTo(current.element) < 0) {                parent = current;                current = current.left;            } else if (e.compareTo(current.element) > 0) {                parent = current;                current = current.right;            } else {                break;            }        }        if (current == null) {            return false;        }        if (current.left == null) {            // case1: current has no left children            if (parent == null) {                root = current.left;            } else {                if (e.compareTo(parent.element) < 0) {                    parent.left = current.right;                } else if (e.compareTo(parent.element) > 0) {                    parent.right = current.right;                }            }        } else {            // case2, current has a left child.            TreeNode<E> parentOfRightMost = null;            TreeNode<E> rightMost = current.left;            while (rightMost.right != null) {                parentOfRightMost = rightMost;                rightMost = rightMost.right;            }            current.element = rightMost.element;            if (parentOfRightMost.right == rightMost) {                parentOfRightMost.right = rightMost.left;            } else {                // Special case: parentOfRightMost == current                parentOfRightMost.left = rightMost.left;            }        }        size--;        return true;    }

0 0
原创粉丝点击