バイナリ検索ツリーからノードを削除する関数を実装するにはどうすればよいですか?以下は私の現在の関数である:それは私は非常に近いが、ときだように私は感じて立ったようバイナリ検索ツリーからノードを削除するには
void remove(TreeNode *&tree, ANY num) {//Removed Need for ">"
if (tree == NULL){
return;
}
if (tree->value == num) {
makeDeletion(tree);
} else if (num < tree->value) {
remove(tree->left, num);
} else {
remove(tree->right, num);
}
};//Remove
:
void makeDeletion(TreeNode *&tree) {
TreeNode *NodeToDelete;
NodeToDelete = tree;
TreeNode *InOrder;
if (tree->right == NULL && tree->left == NULL) {
delete NodeToDelete;
}
if (tree->right == NULL) {
tree = tree->left;
delete NodeToDelete;
}
else if (tree->left == NULL) {
tree = tree->right;
delete NodeToDelete;
}
else {
InOrder = tree->right;
while (InOrder->left != NULL) {
InOrder = InOrder->left;
}
NodeToDelete->value = InOrder->value;
remove(InOrder, InOrder->value);
}
}
そして、ここでは、私はそれを削除する値を見つけていremove
機能ですプログラムがクラッシュするバイナリツリーの内容を出力します。私は、ノードが2人の子供を持っている場合、次の順番でノードの値をスワップし、そのノードの後継者とノードを「削除」し、その後継者を削除するアプローチを使用しようとしています。 。 remove
機能を調整しないと、makeDeletion
機能を説明どおりに動作させるために、どのような情報が欠けていますか?
編集:makeDeletion
機能私は誤って2つの文を連続して書きました。 2番目のif
ステートメントはelse if
ステートメントでなければなりません。 makeDeletion
で
完全なソースコードといくつかの入力データを提供できますか? – abdullah
私はかなり新しいスタックオーバーフローを使用しているので、コード全体を書き込むことなくファイルを投稿する方法はありますか?私はバイナリツリーを定義し、それをテストするファイルが2つあります。 –
あなたのコードとデータを別の場所に置き、ここにリンクを提供することができます – abdullah