Skip to content

Commit

Permalink
删除二分搜索树的任意节点
Browse files Browse the repository at this point in the history
  • Loading branch information
liusishan committed Feb 20, 2019
1 parent d1e4253 commit 199cde1
Showing 1 changed file with 52 additions and 0 deletions.
52 changes: 52 additions & 0 deletions 06-Binary-Search-Tree/02-Remove-Min-and-Max-in-BST/src/BST.java
Original file line number Diff line number Diff line change
Expand Up @@ -233,6 +233,58 @@ private Node removeMax(Node node) {
return node;
}

// 从二分搜索树中删除元素为e的节点
public void remove(E e) {
root = remove(root, e);
}

// 删除以node为根的二分搜索树种值为e的节点,递归算法
// 返回删除节点后新的二分搜索树的根
private Node remove(Node node, E e) {

if (node == null)
return null;

if (e.compareTo(node.e) < 0) {
node.left = remove(node.left, e);
return node;
} else if (e.compareTo(node.e) > 0) {
node.right = remove(node.right, e);
return node;
} else { // e ==node.e

// 待删除结点左子树为空的情况
if (node.left == null) {
Node rightNode = node.right;
node.right = null;
size--;
return rightNode;
}

// 待删除结点右子树为空的情况
if (node.right == null) {
Node leftNode = node.left;
node.left = null;
size--;
return leftNode;
}

// 待删除结点左右子树均不为空的情况
// 找到比待删除结点大的最小结点,即待删除结点右子树的最小结点
// 用这个结点顶替待删除节点的位置
Node successor = minimum(node.right);
successor.right = removeMin(node.right);
successor.left = node.left;
// size++;

node.left = node.right = null;
// size--;

return successor;
}

}

@Override
public String toString() {
StringBuilder res = new StringBuilder();
Expand Down

0 comments on commit 199cde1

Please sign in to comment.