Q&A
###前提・実現したいこと
http://judge.u-aizu.ac.jp/onlinejudge/description.jsp?id=ALDS1_8_B&lang=jp
のサイトの、2分探索木の問題について、std::cinでの入力に関して質問があります。
###発生している問題・エラーメッセージ
上記サイトの「入力例1」を実行すると、最終行の「print」をstd::cinで読み込むと、永遠と入力待ちになってしまいます。
###該当のソースコード
c++
1#define _CRT_SECURE_NO_WARNINGS 2#define _USE_MATH_DEFINES 3#include <iostream> 4#include <cstdlib> 5#include <string> 6#include <cstdio> 7#include <algorithm> 8#include <math.h> 9#include <vector> 10 11using namespace std; 12 13struct Node { 14 int key; 15 Node* parent; 16 Node* left; 17 Node* right; 18}; 19 20Node* root=nullptr; 21 22void firstPrint(Node *node) { 23 if (node == nullptr) { 24 return; 25 } 26 printf(" %d", node->key); 27 firstPrint(node->left); 28 firstPrint(node->right); 29} 30 31void middlePrint(Node *node) { 32 if (node == nullptr) { 33 return; 34 } 35 middlePrint(node->left); 36 printf(" %d", node->key); 37 middlePrint(node->right); 38} 39 40void insert(int key) { 41 Node* node = (Node*)calloc(1, sizeof(Node)); 42 node->key = key; 43 if (root == nullptr) { 44 root = node; 45 node->parent = nullptr; 46 return; 47 } 48 49 Node* p = root; 50 Node* parent=p->parent; 51 while (p !=nullptr) { 52 if (p->key < key) { 53 parent = p; 54 p = p->right; 55 } 56 else if (p->key > key) { 57 parent = p; 58 p = p->left; 59 } 60 else { 61 return; 62 } 63 } 64 65 node->parent = parent; 66 67 if (parent->key < key) { 68 parent->right = node; 69 } 70 else if (parent->key > key) { 71 parent->left = node; 72 } 73 74} 75 76bool find(int key) { 77 bool isFind = false; 78 Node* p = root; 79 while (p != nullptr) { 80 if (p->key == key) { 81 isFind = true; 82 break; 83 } 84 else if (p->key > key) { 85 p = p->left; 86 } 87 else { 88 p = p->right; 89 } 90 } 91 92 return isFind; 93 94} 95 96void print(Node *node) { 97 middlePrint(node); printf("\n"); 98 firstPrint(node); printf("\n"); 99} 100 101 102int main() { 103 104 cin.tie(0); 105 ios::sync_with_stdio(false); 106 107 int m; scanf("%d", &m); 108 string str; 109 for (int i = 0; i < m; i++) { 110 cin >> str; 111 112 //insert 113 if (str =="insert") { 114 int key; scanf("%d", &key); 115 insert(key); 116 } 117 //find 118 else if (str[0] == 'f') { 119 int key; scanf("%d", &key); 120 if (find(key)) { 121 printf("yes\n"); 122 } 123 else { 124 printf("no\n"); 125 } 126 } 127 //print 128 else { 129 print(root); 130 } 131 } 132 133 return 0; 134 135} 136 137
###試したこと
VisualStudioのデバッガを使用して色々と調べたのですが最終行の「print」を読み込んだときのみ、cin関数で処理が止まってしまいました。
また、コピペで入力例を入力するのではなく、自分で入力例を入力するとちゃんと動作しました。
なぜ自分で打ち込めば動き、コピペで入力すると動かないのかがよくわかりませんでした。
###補足情報(言語/FW/ツール等のバージョンなど)
言語:C++14
IDE:Visual Studio2015 Express
回答3件
あなたの回答
tips
プレビュー
下記のような回答は推奨されていません。
このような回答には修正を依頼しましょう。
2018/01/16 12:10
2018/01/16 12:40