删除二叉排序树的结点
有两个方法
法一:找到需要删除的结点后,用左子树最大的结点代替
void DeleteNode(BiTree &root,KeyType x){ if(root == NULL){ return; } if(root->key>x){ DeleteNode(root->lchild,x);//遍历到的结点值比所给值大,就需要遍历左子树 }else if(root->key<x){ DeleteNode(root->rchild,x);//遍历到的结点值比所给值小,就需要遍历右子树 }else{ //查找到了删除节点 //左或者右结点为空只需要将剩下的右或者左子树换上去 if(root->lchild == NULL){ //左子树为空 BiTree tempNode = root; root = root->rchild; free(tempNode); }else if(root->rchild == NULL){ //右子树为空 BiTree tempNode = root; root = root->lchild; free(tempNode); }else{//左右子树都不为空 //一般的删除策略是左子树的最大数据 或 右子树的最小数据 代替该节点 //(这里采用查找左子树最大数据来代替,最大是在左子树的最右那个节点 BiTree tempNode = root->lchild;//找左子树 if(tempNode->rchild!=NULL){ tempNode = tempNode->rchild;//找左子树的右子树 } root->key = tempNode->key;//将右子树的值赋给需要删除的那结点 DeleteNode(root->lchild,tempNode->key);//删除右子树 } } }
法二 找右子树最小的来代替,然后再删除那个小的
//与上面代码不同的地方 BiTree tempNode = root->rchild; if(tempNode->lchild!=NULL){ tempNode = tempNode->lchild; } root->key = tempNode->key; DeleteNode(root->rchild,tempNode->key);