Computer >> 컴퓨터 >  >> 프로그램 작성 >> C++

C++의 문자열에서 이진 트리 생성

<시간/>

괄호와 정수로 구성된 문자열이 있다고 가정합니다. 우리는 그 문자열로부터 이진 트리를 구성해야 합니다. 전체 입력은 이진 트리를 나타냅니다. 0, 한 쌍 또는 두 쌍의 괄호가 뒤에 오는 정수를 보유합니다. 정수는 루트 값을 나타내며 한 쌍의 괄호에는 동일한 구조의 자식 바이너리 트리가 포함됩니다.

따라서 입력이 "4(2(3)(1))(6(5))"와 같으면 출력은 [3,2,1,4,5,6](중위 순회)

C++의 문자열에서 이진 트리 생성

이 문제를 해결하기 위해 다음 단계를 따릅니다. −

  • 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