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

C++의 선주문 순회에서 트리 복구


바이너리 트리가 있다고 가정합니다. 바이너리 트리의 루트에서 사전 주문 깊이 우선 검색을 실행할 것입니다.

이 탐색의 각 노드에서 출력은 D 수의 대시(여기서 D는 이 노드의 깊이)가 된 후 이 노드의 값을 표시합니다. 노드의 깊이가 D이면 직계 자식의 깊이는 D+1이고 루트 노드의 깊이는 0입니다.

노드에 자식이 하나만 있는 경우 해당 자식은 왼쪽 자식으로 보장된다는 점을 명심해야 합니다. 따라서 이 탐색의 출력 S가 제공되면 트리를 복구하고 루트를 반환합니다.

따라서 입력이 "1-2--3--4-5--6--7"과 같으면 출력은

C++의 선주문 순회에서 트리 복구

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

  • 하나의 스택 정의

  • i :=0, n :=S

    의 크기
  • 레벨 :=0, 숫자 :=0

  • 나는

    • 초기화 lvl :=0의 경우, S[i]가 '-'와 같을 때 업데이트(lvl을 1만큼 증가), (i를 1만큼 증가) 다음을 수행합니다. -

      • 아무것도 하지 않는다

    • 숫자 :=0

    • 동안 (i

      • 숫자 :=숫자 * 10 + (S[i] - '0')

      • (i를 1씩 증가)

    • st> lvl의 크기 동안 수행 -

      • st

        에서 요소 삭제
    • temp =num 값으로 새 트리 노드 생성

    • st가 비어 있지 않고 st의 맨 위 요소 왼쪽에 없으면 null이면 -

      • st의 상단 요소 왼쪽 :=temp

    • 그렇지 않으면 not st가 비어 있으면 -

      • st의 상단 요소 오른쪽 :=temp

    • st에 temp 삽입

  • 크기가 st> 1인 동안 −

    • st

      에서 요소 삭제
  • 반환(st가 비어 있으면 NULL, 그렇지 않으면 st의 최상위 요소)

이해를 돕기 위해 다음 구현을 살펴보겠습니다. −

예시

#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* recoverFromPreorder(string S) {
      stack<TreeNode*> st;
      int i = 0;
      int n = S.size();
      int lvl = 0;
      int num = 0;
      while (i < n) {
         for (lvl = 0; S[i] == '-'; lvl++, i++)
         ;
         num = 0;
         while (i < n && S[i] != '-') {
            num = num * 10 + (S[i] - '0');
            i++;
         }
         while (st.size() > lvl)
         st.pop();
         TreeNode* temp = new TreeNode(num);
         if (!st.empty() && !st.top()->left) {
            st.top()->left = temp;
         }
         else if (!st.empty()) {
            st.top()->right = temp;
         }
         st.push(temp);
      }
      while (st.size() > 1)
      st.pop();
      return st.empty() ? NULL : st.top();
   }
};
main(){
   Solution ob;
   TreeNode *root = ob.recoverFromPreorder("1-2--3--4-5--6--7");
   inord(root);
}

입력

"1-2--3--4-5--6--7"

출력

3 2 4 1 6 5 7