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

C++의 이진 트리에 있는 노드의 후계자


이 문제에서는 이진 트리와 노드가 제공됩니다. 우리의 임무는 이진 트리에서 노드의 후위 순서를 인쇄하는 것입니다.

바이너리 나무 각 노드가 최대 2개의 자식 노드를 가질 수 있는 특수한 유형의 트리입니다.

C++의 이진 트리에 있는 노드의 후계자

포스터 순회 첫 번째 왼쪽 하위 트리가 오른쪽 하위 트리보다 탐색되고 루트가 끝에서 탐색되는 트리 탐색 기술입니다.

위 트리의 후위 순회:8 4 2 7 9 6

문제를 이해하기 위해 예를 들어보겠습니다.

입력 - 위의 예에서 이진 트리, 노드=7

출력 − 9

설명 − 이진 트리의 후위 순회에서 볼 수 있습니다.

이 문제를 해결하기 위해 간단하고 쉬운 멍청한 해결책은 단순히 후위 순회를 찾은 다음 순회에서 그 옆에 있는 숫자를 인쇄하는 것입니다.

하지만 더 효과적인 솔루션을 배워야 합니다.

효과적인 솔루션은 후위 순회에 대한 몇 가지 일반적인 관찰을 사용하는 것입니다.

  • 루트는 후위 순회에서 마지막 노드이므로 후속 노드는 NULL입니다.

  • 현재 노드가 오른쪽 자식인 경우 부모 노드가 후속 노드입니다.

  • 현재 노드가 자식으로 남아 있는 경우

    • 오른쪽 형제가 없으면 후임자가 부모 노드입니다.

    • 오른쪽 형제가 존재하는 경우 노드 또는 가장 왼쪽에 있는 자식이 후임자입니다.

이 방법이 효과적이며 시간 복잡도는 O(h), 그의 트리 높이입니다.

예시

솔루션 구현을 보여주는 프로그램,

#include <iostream>
using namespace std;
struct Node {
   struct Node *left, *right, *parent;
   int value;
};
struct Node* insertNode(int value) {
   Node* temp = new Node;
   temp->left = temp->right = temp->parent = NULL;
   temp->value = value;
   return temp;
}
Node* findPostorderSuccessor(Node* root, Node* n) {
   if (n == root)
      return NULL;
   Node* parent = n->parent;
   if (parent->right == NULL || parent->right == n)
      return parent;
   Node* curr = parent->right;
   while (curr->left != NULL)
      curr = curr->left;
   return curr;
}
int main(){
   struct Node* root = insertNode(6);
   root->parent = NULL;
   root->left = insertNode(2);
   root->left->parent = root;
   root->left->left = insertNode(8);
   root->left->left->parent = root->left;
   root->left->right = insertNode(4);
   root->left->right->parent = root->left;
   root->right = insertNode(9);
   root->right->parent = root;
   root->right->left = insertNode(7);
   root->right->left->parent = root->right;
   root->left->right->left = insertNode(14);
   struct Node* successorNode = findPostorderSuccessor(root, root->left->right);
   if (successorNode)
      cout<<"Postorder successor of "<<root->left->right->value<<" is "<<successorNode->value;
   else
      cout<<"Postorder successor of "<<root->left->right->value<<" is NULL";
   return 0;
}

출력

Postorder successor of 4 is 2