二叉树删除结点
/**
* delete: 从二叉查找树中删除给定的结点.
*
* @param pNode 要删除的结点 前置条件: 给定结点在二叉查找树中已经存在
* 删除后要调整二叉查找树,满足左小右大结构
* @throws Exception
*/
private void delete(TreeNode pNode) throws Exception {
if (pNode == null) {
return;
}
if (pNode.leftChild == null && pNode.rightChild == null) { // 该结点既无左孩子结点,也无右孩子结点
TreeNode parentNode = pNode.parent;
if (pNode == parentNode.leftChild) {
parentNode.leftChild = null;
} else {
parentNode.rightChild = null;
}
pNode=null;
return;
}
if (pNode.leftChild == null && pNode.rightChild != null) { // 该结点左孩子结点为空,右孩子结点非空
TreeNode parentNode = pNode.parent;
TreeNode rightNode=pNode.rightChild;
if (pNode == parentNode.leftChild) {
rightNode.parent = parentNode;
parentNode.leftChild = rightNode;
} else {
rightNode.parent = parentNode;
parentNode.rightChild = rightNode;
}
pNode=null;
return;
}
if (pNode.leftChild != null && pNode.rightChild == null) { // 该结点左孩子结点非空,右孩子结点为空
TreeNode parentNode = pNode.parent;
TreeNode leftNode=pNode.leftChild;
if (pNode == parentNode.leftChild) {
leftNode.parent = parentNode;
parentNode.leftChild = leftNode;
} else {
leftNode.parent = parentNode;
parentNode.rightChild = leftNode;
}
pNode=null;
return;
}
if(pNode.leftChild != null && pNode.rightChild != null){// 该结点左右孩子结点均非空
TreeNode successorNode = successor(pNode);
pNode.key = successorNode.key;
delete(successorNode);
}
}