見た質問
ログイン 新規登録

お使いのブラウザ(Internet Explorer)では閲覧、ログイン、質問の作成や回答などに不具合が生じることがございます。
誠に恐れ入りますが、下記の推奨ブラウザをご利用くださいませ。

推奨ブラウザ:Google Chrome(グーグル・クローム)

質問:Python の文字列処理の課題になります。 replace('A','T')とreplace('T', A)を繰り返...

tamu tamu オンライン家庭教師の回答

replace('A',t)…として、い...

C++で木構造編集プログラムに、ノードの削除機能を追加してい...

■どこまで理解しているか


C++で木構造編集プログラムに、ノードの削除機能を追加しています.
コマンドは、以下の形式とします.
「 D n L|R 」: n番ノードの左(L)または右(R)の子ノードを削除する.
削除対象ノードが1つの子を持つときには、その子を削除ノードのあった位置に接続します.2つの子を持つときには削除しません.

以下がノードを削除する関数のコードです.

//
//----ノードを削除する。-----
//
void deleteNode(int nodeNo, char direction) {

Node* pNode; //ノードへのポインタ

//ノード番号に対応するノード(現ノード)を探索してポインタを得る。
pNode = searchNode(nodeNo);

//ポインタがNULLならば探索失敗であるので戻る。
if (pNode == NULL) return;

//方向指示に対応する左右ポインタから、削除対象ノードへのポインタを得る。
Node* pDeleteNode=new Node;
if (direction == RIGHT) pDeleteNode = pNode->pRight;
if (direction == LEFT) pDeleteNode = pNode->pLeft;

//ポインタがNULLであれば削除対象ノードが無いので戻る。
if (pDeleteNode== NULL) return;

//削除対象ノードの下に子ノードが2つあれば削除できないので戻る。
if (pDeleteNode->pRight != NULL && pDeleteNode->pLeft != NULL)return;

//存在する子ノードへのポインタを得る(子ノードが無いならばNULL)。
Node* pChildNode=new Node;
if (direction == RIGHT)pChildNode= pDeleteNode->pRight;
if (direction == LEFT)pChildNode = pDeleteNode->pLeft;
if (pDeleteNode->pRight == NULL && pDeleteNode->pLeft == NULL) pChildNode = NULL;

//子ノードへのポインタを、方向指示に対応して現ノードの左右ポインタのどちらかに入れる。
if (direction == RIGHT)pNode->pRight = pDeleteNode->pRight;
if (direction == LEFT)pNode->pLeft = pDeleteNode->pLeft;

//削除対象ノードのメモリ領域を解放する。
delete pDeleteNode;
}

■どこが具体的にわからないか


このコードで実行すると,削除対象ノードは削除されるのですが,削除対象ノードの子が削除ノードのあった位置に接続されません.
正しく出力されるには,削除する関数のコードをどのように直したら良いでしょうか?
教えてください.よろしくお願いします.

2か月前

回答(0件)

この質問に関連した回答一覧