筑波情シス院試CS 28年2月 過去問
またまた二分探索木の問題。情報の問題1。 http://www.cs.tsukuba.ac.jp/admission/past-exam.html
解答
- d
- 進み続ける。無限ループ。
- node != EMPTY
- ここでのEMPTY.value は番兵。番兵を最後において、find_node の無限ループを止めている。
- a, 4. b
- 二部探索木の計算量は $ O(\log n) \sim O(n) $
5 は穴埋めでコード完成。すでにvalueが存在するときはそのままリターン。ここで注意しなきゃいけないのが、関数の型も、引数のtree もポインタ型ではないということ。普段ポインタで慣れている人ほど引っ掛かりそう。
tree insert(tree t,int v){
if (t==&empty){
tree node = malloc()
node->val = v
node->left = node->right = &empty
return node
}
// ここからが答え
if(v < t->value){
&t->left = insert(&t->left, v); // leftがemptyにたどり着くまで再帰。たどり着いた先で上のコードで新しく挿入される。
}else if (v > t->value){
&t->right = &insert(&t->right, v);
}
return t // すでに存在するとき
}