바이너리 트리가 있다고 가정합니다. 바이너리 트리의 루트에서 사전 주문 깊이 우선 검색을 실행할 것입니다.
이 탐색의 각 노드에서 출력은 D 수의 대시(여기서 D는 이 노드의 깊이)가 된 후 이 노드의 값을 표시합니다. 노드의 깊이가 D이면 직계 자식의 깊이는 D+1이고 루트 노드의 깊이는 0입니다.
노드에 자식이 하나만 있는 경우 해당 자식은 왼쪽 자식으로 보장된다는 점을 명심해야 합니다. 따라서 이 탐색의 출력 S가 제공되면 트리를 복구하고 루트를 반환합니다.
따라서 입력이 "1-2--3--4-5--6--7"과 같으면 출력은
이 문제를 해결하기 위해 다음 단계를 따릅니다. −
-
하나의 스택 정의
-
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