想对于二叉查找树的查找、插入等操作来说,二叉查找树的删除操作是比较复杂的。在具体的分析中可以根据待删除节点的:1、左右子树均为空;2、左右子树中有一个为空;3、左右子树均非空的情况来考虑。
其中第3种情况即左右子树均非空的情况较为复杂,删除过程中可以找待删除节点的后继节点,与待删除节点交换,然后把后继节点的右子树接入到待删除节点的父节点即可。
TreeNode* removeNode(TreeNode* root, int value) {
// write your code here
if(root == nullptr)
return root;
TreeNode *p, *q;
p = root;
q = root;
//p 指向待删除的节点,q 指向待删除节点的父节点
while(p){
if(value == p -> val){
break;
}else if(value < p -> val){
q = p;
p = p -> left;
}else{
q = p;
p = p -> right;
}
}
if(p == nullptr)
return root;
//p 是叶子节点
if(p -> left == nullptr && p -> right == nullptr){
if(p == q){
return nullptr;
}else{
if(q -> left == p){
q -> left = nullptr;
}else{
q -> right = nullptr;
}
return root;
}
}
//p 左右子树中有一个为空
if(p -> left == nullptr || p -> right == nullptr){
if(p -> left == nullptr){
if(p == q){
return q -> right;
}else{
if(q -> left == p){
q -> left = p -> right;
}else{
q -> right = p -> right;
}
}
}else{
if(p == q){
return q -> left;
}else{
if(q -> left == p){
q -> left = p -> left;
}else{
q -> right = p -> left;
}
}
}
return root;
}
//p 的左右子树均非空
if(p -> left != nullptr && p -> right != nullptr){
TreeNode *fir = p -> right;
TreeNode *sec = p;
while(fir -> left != nullptr){
sec = fir;
fir = fir -> left;
}
p -> val = fir -> val;
if(p == sec){
p -> right = fir -> right;
}else{
sec -> left = fir -> right;
}
}
return root;
}版权声明:本文为博主原创文章,未经博主允许不得转载。
原文地址:http://blog.csdn.net/ny_mg/article/details/48155259