リンク内容### 前提・実現したいこと
二分探索木T に対し、以下の命令を実行するプログラムを作成してください。
insert k: Tにキー k を挿入する。
という問題なのですが、これをC++で実装するにあたって模範解答を見ると以下のようになってました。しかしこのinsert関数の部分ですが、一番初めにデータを挿入するときrootにどのようにデータが追加されるか理解できません。これだと、xがrootで初期化されていて、whileループに入り、yにxのrootが代入されて, yがNILでなくなってしまうのではないでしょうか。そうなるとif(y == NIL)が偽になってしまい、結局rootが定まらなくなってしまうと思います。もしwhileループを経ないのであれば、どのタイミングでxにNILが代入されるのでしょうか。この点について解説していただけますか。
該当のソースコード
c++
1#include <cstdio> 2#include <cstdlib> 3#include <string> 4#include <iostream> 5 6using namespace std; 7 8struct Node{ 9 int key; 10 Node *right, *left, *parent; 11}; 12 13Node *root, *NIL; 14 15void insert(int k) 16{ 17 Node *y = NIL; 18 Node *x = root; 19 Node *z; 20 21 z = (Node *)malloc(sizeof(Node)); 22 z->key = k; 23 z->left = NIL; 24 z->right = NIL; 25 26 while(x != NIL ){ 27 y = x; 28 if(z->key < x->key){ 29 x = x->left; 30 }else{ 31 x = x->right; 32 } 33 } 34 z->parent = y; 35 if(y == NIL){ 36 root = z; 37 }else { 38 if(z->key < y->key){ 39 y->left = z; 40 }else{ 41 y->right = z; 42 } 43 } 44} 45 46void inorder(Node *u) 47{ 48 if(u == NIL) return; 49 inorder(u->left); 50 printf(" %d", u->key); 51 inorder(u->right); 52} 53 54void preorder(Node *u) 55{ 56 if(u == NIL) return; 57 printf(" %d", u->key); 58 preorder(u->left); 59 preorder(u->right); 60} 61 62int main() 63{ 64 int n, i, x; 65 string com; 66 67 scanf("%d", &n); 68 69 for(i = 0; i < n; i++){ 70 cin >> com; 71 if(com == "insert"){ 72 scanf("%d", &x); 73 insert(x); 74 }else{ 75 inorder(root); 76 printf("\n"); 77 preorder(root); 78 printf("\n"); 79 } 80 } 81 return 0; 82}
何かの「問題」に関する質問には「問題」へのリンクを貼ってください。
コードの書き方について(LouiS0616さん)
https://teratail.com/questions/151115
>>teratailには、コードを見やすく表示する機能があります。
>>質問編集画面を開き、コードを選択した状態で<code>ボタンを押してください。
AOJの問題ですよね?引用する場合は「問題」へのリンクを貼ってください。
回答2件
あなたの回答
tips
プレビュー