有兩個方法
法一:找到需要刪除的結點后,用左子樹最大的結點代替
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);