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

C++에서 N-ary 트리를 이진 트리로 인코딩

<시간/>

N-ary 트리가 있다고 가정합니다. 우리는 그 트리를 하나의 바이너리로 인코딩해야 합니다. 또한 이진 트리를 N-진 트리로 역직렬화하기 위해 역직렬화기를 만들어야 합니다.

따라서 입력이 다음과 같으면

C++에서 N-ary 트리를 이진 트리로 인코딩

그러면 출력은

C++에서 N-ary 트리를 이진 트리로 인코딩

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

  • encode() 함수를 정의하면 루트가 됩니다.

  • 루트가 유효하면 -

    • null 반환

  • 노드 =루트 값을 가진 새 트리 노드

  • 루트의 자식 크기가 0이 아니면 -

    • 노드 왼쪽 :=encode(root의 children[0])

  • curr =노드의 왼쪽

  • for initialize i :=1, i <루트의 자식 크기일 때 업데이트(i를 1만큼 증가), -

    • 노드 오른쪽 :=encode(root의 자식[i])

    • curr :=curr의 오른쪽

  • 반환 노드

  • Decode() 함수를 정의하면 루트가 됩니다.

  • 루트가 없으면 -

    • NULL 반환

  • node :=val이 root인 새 노드

  • curr :=루트 왼쪽

  • curr이 0이 아닌 동안 수행 -

    • 노드의 자식 끝에 디코드(curr) 삽입

    • curr :=curr의 오른쪽

  • 반환 노드

예시

더 나은 이해를 위해 다음 구현을 살펴보겠습니다. −

#include 네임스페이스 std;class TreeNode {public:int val; 트리노드 *왼쪽, *오른쪽; TreeNode(int 데이터) { 발 =데이터; 왼쪽 =NULL; 오른쪽 =NULL; }}; 무효 inord(TreeNode *루트) { if (루트 !=NULL) { inord(루트->왼쪽); cout <<루트->발 <<" "; inord(루트->오른쪽); }}클래스 노드 { 공개:int val; 벡터<노드*> 자식; 노드() {} 노드(int _val) { val =_val; } 노드(int _val, 벡터<노드*> _children) { 발 =_val; 어린이 =_어린이; }};문자열 n_ary_to_str(노드 *루트){문자열 ret =""; if(루트){ ret =ret + to_string(루트->발); if(root->children.size()> 0){ ret +="["; for(노드* 자식 :루트->자식){ ret +=n_ary_to_str(자식) + ", "; } 렛 +="]"; } } return ret;}class Codec {공개:TreeNode* encode(Node* root) { if(!root) return NULL; TreeNode* 노드 =new TreeNode(root->val); if(root->children.size()){ node->left =encode(root->children[0]); } TreeNode* curr =노드->왼쪽; for(int i =1; i children.size(); i++){ curr->right =encode(root->children[i]); curr =curr->오른쪽; } 반환 노드; } Node* decode(TreeNode* root) { if(!root) return NULL; 노드* 노드 =새로운 노드(루트->발); TreeNode* curr =루트->왼쪽; while(curr){ node->children.push_back(decode(curr)); curr =curr->오른쪽; } 반환 노드; }};main() { 코덱 ob; 노드 n5(5), n6(6); 노드 n3(3); n3.children.push_back(&n5); n3.children.push_back(&n6); 노드 n2(2), n4(4); 노드 n1(1); n1.children.push_back(&n3); n1.children.push_back(&n2); n1.children.push_back(&n4); cout <<"주어진 트리:" < 

입력

노드 n5(5), n6(6);노드 n3(3); n3.children.push_back(&n5); n3.children.push_back(&n6);노드 n2(2), n4(4);노드 n1(1); n1.children.push_back(&n3); n1.children.push_back(&n2);n1.children.push_back(&n4);

출력

주어진 트리:1[3[5, 6, ], 2, 4, ]직렬화된 이진 트리:5 6 3 2 4 1역직렬화된 트리:1[3[5, 6, ], 2, 4, ]