お仕事でいろいろとやられているので間が空いてしまいました。
今回のお題は前回の内容を引き継いでいるので、あとは探索機能を入れるだけでした。
※20180417追記:巡回出力のところがバグっていたので直しました
#include <iostream> #include <cstdio> #include <memory> using namespace std; struct Node { int key; Node* parent; Node* left; Node* right; Node(int key = -1) : key(key), parent(nullptr), left(nullptr), right(nullptr) {}; }; struct Tree { Node* root; Tree() : root(nullptr) {}; }; static void insert(Tree& tree, int v) { Node* z = new Node(v); Node* x(tree.root); Node* y(nullptr); while (x != nullptr) { y = x; if (z->key < x->key) { x = x->left; } else { x = x->right; } } z->parent = y; if (y == nullptr) { tree.root = z; } else if (z->key < y->key) { y->left = z; } else { y->right = z; } } static bool find(const Node* node, int v) { if (node == nullptr) { return false; } if (node->key > v) { return find(node->left, v); } else if (node->key < v) { return find(node->right, v); } return true; } void preorderWalk(const Node* node) { if (!node) { return; } cout << " " << node->key; if (node->left != nullptr) { preorderWalk(node->left); } if (node->right != nullptr) { preorderWalk(node->right); } } void inorderWalk(const Node* node) { if (!node) { return; } if (node->left != nullptr) { inorderWalk(node->left); } cout << " " << node->key; if (node->right != nullptr) { inorderWalk(node->right); } } static Tree TREE; int main() { int n; cin >> n; string command; int v; for (int i = 0; i < n; i++) { cin >> command; if (command[0] == 'i') { scanf("%d", &v); insert(TREE, v); } else if (command[0] == 'f') { scanf("%d", &v); bool found = find(TREE.root, v); cout << (found ? "yes" : "no") << endl; } else { inorderWalk(TREE.root); cout << endl; preorderWalk(TREE.root); cout << endl; } } return 0; }