現在、
[ALDS1_8_A](https://onlinejudge.u-aizu.ac.jp/courses/lesson/1/ALDS1/8/ALDS1_8_A)を行っています。2分探索木です。

解答コードは、以下のような形です。

insert関数の中で、`x`を現在の比べるノード,`y`を親のノード,`z`を挿入するノード  
として考えていると思うのですが、xに対して初期値の`root`ポインタを入れている挙動が分かりません。  
具体的には、While文の条件文です。  
`x`が`Nil`ではない条件だと思うのですが、そもそもxに最初から`Nil`なんて入っているのでしょうか？  
xに入っている初期の値は、Nilではなく`root`だと思います。  
`root`は、Nodeポインタ型だと思うのですが、`root`は`Nil`ではないと思います。  
C/C++では、変数は定義したが実際にはその中に値が入っていない場合は`Nil`となるのでしょうか？

ご教授よろしくお願い致します。

```

    struct Node {
      int key;
      Node *right, *left;
    };
    
    Node *root, *NIL;
    
    void insert(int k) {
      Node *y = NIL;
      Node *x = root;
      Node *z;
    
      z = (Node *)malloc(sizeof(Node));
      z->key = k;
      z->left = NIL;
      z->right = NIL;
    
      while ( x != NIL ) {
        y = x;
        if ( z->key < x->key )
          x = x->left;
        else
          x = x->right;
      }
    
      if ( y == NIL ) {
        root = z;
      } else {
        if ( z->key < y->key )
          y->left = z;
        else
          y->right = z;
      }
    }
    
```
CC BY-SA 4.0
2023-01-08T04:21:50.043
93238
2023-01-08T07:35:56.987
2023-01-08T07:35:56.987
3060
47147
question
c++ c
C/C++において、変数定義のみの場合はNilとなるのか？
```

    Node *root, *NIL;
    
```

`root`、`NIL` はグローバル変数なので、初期値は 0 になります。よって、ローカル変数 `x` も `y` も初期値は 0 です。`NIL`
との比較は 0 と比較していることになります。

* * *

C言語のまともなコードなら、`NIL` という変数は作らずに `NULL` を使うのが普通でしょう。C++のまともなコードなら、`NIL`
という変数は作らずに `nullptr` を使うのが普通でしょう。
CC BY-SA 4.0
2023-01-08T04:39:48.957
93239
2023-01-08T05:10:40.227
2023-01-08T05:10:40.227
3475
3475
93238
answer