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

C++에서 주어진 이진 트리를 이중 연결 목록(세트 2)으로 변환

<시간/>

이 자습서에서는 이진 트리를 이중 연결 목록으로 변환하는 프로그램에 대해 설명합니다.

이를 위해 이진 트리가 제공됩니다. 우리의 임무는 왼쪽 및 오른쪽 포인터가 이전 및 다음 포인터가 되도록 이중 연결 목록으로 변환하는 것입니다. 또한 이중 연결 목록의 순차 순서는 이진 트리의 중위 순회와 같아야 합니다.

이를 위해 우리는 다른 접근 방식을 취하고 있습니다. 우리는 역순으로 이진 트리를 탐색할 것입니다. 이와 함께 새 노드를 만들고 헤드 포인터를 최신 노드로 이동합니다. 이렇게 하면 끝에서 시작까지 이중 연결 목록이 생성됩니다.

#include <stdio.h>
#include <stdlib.h>
//node structure for tree
struct Node{
   int data;
   Node *left, *right;
};
//converting the binary tree to
//doubly linked list
void binary_todll(Node* root, Node** head_ref){
   if (root == NULL)
      return;
   //converting right subtree
   binary_todll(root->right, head_ref);
   //inserting the root value to the
   //doubly linked list
   root->right = *head_ref;
   //moving the head pointer
   if (*head_ref != NULL)
      (*head_ref)->left = root;
   *head_ref = root;
   //converting left subtree
   binary_todll(root->left, head_ref);
}
//allocating new node for doubly linked list
Node* newNode(int data){
   Node* node = new Node;
   node->data = data;
   node->left = node->right = NULL;
      return node;
}
//printing doubly linked list
void print_dll(Node* head){
   printf("Doubly Linked list:\n");
   while (head) {
      printf("%d ", head->data);
      head = head->right;
   }
}
int main(){
   Node* root = newNode(5);
   root->left = newNode(3);
   root->right = newNode(6);
   root->left->left = newNode(1);
   root->left->right = newNode(4);
   root->right->right = newNode(8);
   root->left->left->left = newNode(0);
   root->left->left->right = newNode(2);
   root->right->right->left = newNode(7);
   root->right->right->right = newNode(9);
   Node* head = NULL;
   binary_todll(root, &head);
   print_dll(head);
   return 0;
}

출력

Doubly Linked list:
0 1 2 3 4 5 6 7 8 9