반응형
출처:https://www.acmicpc.net/problem/1991
문제
이진 트리를 입력받아 전위 순회(preorder traversal), 중위 순회(inorder traversal), 후위 순회(postorder traversal)한 결과를 출력하는 프로그램을 작성하시오.
예를 들어 위와 같은 이진 트리가 입력되면,
- 전위 순회한 결과 : ABDCEFG // (루트) (왼쪽 자식) (오른쪽 자식)
- 중위 순회한 결과 : DBAECFG // (왼쪽 자식) (루트) (오른쪽 자식)
- 후위 순회한 결과 : DBEGFCA // (왼쪽 자식) (오른쪽 자식) (루트)
가 된다.
문제 해결 과정:
-이진 트리를 만든다
-insert search함수를 만들어 트리를 만든다.
-visit함수를 만들고
-Inorder preorder postorder를 만든다.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 | #include<iostream> using namespace std; struct Node { char val; Node* leftChild = NULL; Node* rightChild = NULL; }; class BinaryTree{ private: Node* root; public: BinaryTree() { root = NULL; } BinaryTree(Node* a) { root = a; } void insertNode(char parent,char leftChild,char rightChild) { Node* Nparent = new Node; Node* Nleft = new Node; Node* Nright = new Node; if (leftChild == '.') { Nleft =NULL; } else { Nleft->val = leftChild; } if (rightChild == '.') { Nright = NULL; } else { Nright->val = rightChild; } if (root == NULL) { Nparent->val = parent; Nparent->rightChild = Nright; Nparent->leftChild = Nleft; root = Nparent; } else { Node* p = new Node; p=searchNodeVal(root, parent); p->leftChild = Nleft; p->rightChild = Nright; } } Node* searchNodeVal(Node* current,char val) { if (current == NULL)return NULL; if (val == current->val) { return current; } else { if (searchNodeVal(current->leftChild, val)== NULL) { searchNodeVal(current->rightChild, val); } } } void visit(Node* node) { cout << node->val; } void InOrder(Node* current) { if (current == NULL) { return; } InOrder(current->leftChild); visit(current); InOrder(current->rightChild); } void preOrder(Node* current) { if (current == NULL) { return; } visit(current); InOrder(current->leftChild); InOrder(current->rightChild); } void postOrder(Node* current) { if (current == NULL) { return; } InOrder(current->leftChild); InOrder(current->rightChild); visit(current); } Node* getRoot() { return root; } }; int main() { BinaryTree Tree; int n; char a, b, c; cin >> n; for (int i = 0; i < n; i++) { cin >> a >> b >> c; Tree.insertNode(a, b, c); } Tree.preOrder(Tree.getRoot()); cout << endl; Tree.InOrder(Tree.getRoot()); cout << endl; Tree.postOrder(Tree.getRoot()); cout << endl; return 0; } | cs |
반응형
'알고리즘' 카테고리의 다른 글
11_30<백준>2957번 이진 탐색 트리 (0) | 2017.11.30 |
---|---|
2017_11_29<백준> 2178번 미로 탐색 (0) | 2017.11.29 |
2017_11_27<백준>3613번 Java vs C++ (0) | 2017.11.27 |
2017_11_25 <백준> 1260번 DFS와 BFS (0) | 2017.11.25 |
2017_11_24<백준>2504번 괄호의 값 (c++) (0) | 2017.11.24 |