void remove_rec(BSTNode* cur) { if (cur == nullptr) return; if (cur->left_ == nullptr && cur->right_ == nullptr) { remove_zero_child(cur); return; } if (cur->left_ == nullptr || cur->right_ == nullptr) { remove_one_child(cur); return; } BSTNode* p = cur->left_; while (p->right_ != nullptr) p = p->right_; std::swap(cur->key_, p->key_); remove_rec(p); }
void remove(const Key& k) { BSTNode* cur = find_rec(this->root_, k); remove_rec(cur); }
void process() { int i; char line[100]; char cmd, arg[100]; bool done; rec_t rec; done = false; while (1) { printf("> "); fflush(stdout); if (!fgets(line, sizeof(line), stdin)) break; sscanf(line, "%c %[^\n]", &cmd, arg); switch (cmd) { FILE *fout, *fin; case 'i': snprintf(rec.name, sizeof(rec.name), "%s", arg); rec.x = 0; rec.y = 0; *rec.addr = '\0'; if (insert_rec(root_idx, &rec)) { fprintf(stderr, "Duplicate found.\n"); } break; case 'r': snprintf(rec.name, sizeof(rec.name), "%s", arg); remove_rec(root_idx, &rec); break; case 's': snprintf(rec.name, sizeof(rec.name), "%s", arg); if (!search_rec(root_idx, &rec)) { printf("Record found: "); rec_print(&rec); printf("\n"); } else { fprintf(stderr, "Record not found.\n"); } break; case 'p': fout = fopen("pout.txt", "w"); print_node(fout, root_idx); fclose(fout); break; case 'k': fin = fopen("../names_200k.txt", "r"); for (i=0;i<10000;i++) { if (!fgets(line, sizeof(line), fin)) break; if (*line) { char *end = line+strlen(line)-1; if (*end == '\n') *end = '\0'; } snprintf(rec.name, sizeof(rec.name), "%s", line); remove_rec(root_idx, &rec); } fclose(fin); fout = fopen("pout.txt", "w"); print_node(fout, root_idx); fclose(fout); break; case 'q': done = true; break; default: fprintf(stderr, "Invalid input.\n"); break; } if (done) break; } }