괄호와 정수로 구성된 문자열이 있다고 가정합니다. 우리는 그 문자열로부터 이진 트리를 구성해야 합니다. 전체 입력은 이진 트리를 나타냅니다. 0, 한 쌍 또는 두 쌍의 괄호가 뒤에 오는 정수를 보유합니다. 정수는 루트 값을 나타내며 한 쌍의 괄호에는 동일한 구조의 자식 바이너리 트리가 포함됩니다.
따라서 입력이 "4(2(3)(1))(6(5))"와 같으면 출력은 [3,2,1,4,5,6](중위 순회)피>

이 문제를 해결하기 위해 다음 단계를 따릅니다. −
-
solve() 함수를 정의하면 s, idx,
가 필요합니다. -
idx>=크기가 s이면 -
-
null 반환
-
-
num :=빈 문자열
-
동안 (idx
-
숫자 :=숫자 + s[idx]
-
(idx를 1씩 증가)
-
-
노드 =값이 num인 새 노드
-
idx
-
(idx를 1씩 증가)
-
노드 왼쪽 :=solve(s, idx)
-
(idx를 1씩 증가)
-
idx
-
(idx를 1씩 증가)
-
노드 오른쪽 :=solve(s, idx)
-
(idx를 1씩 증가)
-
-
-
반환 노드
-
주요 방법에서 다음을 수행하십시오 -
-
아이디:=0
-
temp =값이 -1인 새 노드
-
해결(s, idx) 반환
예시(C++)
이해를 돕기 위해 다음 구현을 살펴보겠습니다. −
#include <bits/stdc++.h>
using namespace std;
class TreeNode{
public:
int val;
TreeNode *left, *right;
TreeNode(int data){
val = data;
left = NULL;
right = NULL;
}
};
void inord(TreeNode *root){
if(root != NULL){
inord(root->left);
cout << root->val << " ";
inord(root->right);
}
}
class Solution {
public:
TreeNode* solve(string s, int& idx){
if (idx >= s.size())
return NULL;
string num = "";
while (idx < s.size() && s[idx] != '(' && s[idx] != ')') {
num += s[idx];
idx++;
}
TreeNode* node = new TreeNode(stoi(num));
if (idx < s.size() && s[idx] == '(') {
idx++;
node->left = solve(s, idx);
idx++;
if (idx < s.size() && s[idx] == '(') {
idx++;
node->right = solve(s, idx);
idx++;
}
}
return node;
}
TreeNode* str2tree(string s) {
int idx = 0;
TreeNode* temp = new TreeNode(-1);
return solve(s, idx);
}
};
main(){
Solution ob;
TreeNode *root = ob.str2tree("4(2(3)(1))(6(5))");
inord(root);
} 입력
"4(2(3)(1))(6(5))"
출력
3 2 1 4 5 6