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

C++에서 이진 트리의 두 노드를 결합하여 형성할 수 있는 최대 길이 주기

<시간/>

이진 트리가 주어집니다. 목표는 주어진 트리에서 최대 길이 사이클을 찾는 것입니다. 루트노드에서 왼쪽 서브트리와 오른쪽 서브트리의 최대 높이를 찾아 이를 수행하고 이러한 최대 길이 경로를 결합하여 가장 긴 주기를 얻습니다.

C++에서 이진 트리의 두 노드를 결합하여 형성할 수 있는 최대 길이 주기

위의 트리에서 최대 길이 주기는 1-2-3-4-7-6 또는 1-6-7-4-3-2-1입니다. 길이는 6입니다.

입력 - 나무

C++에서 이진 트리의 두 노드를 결합하여 형성할 수 있는 최대 길이 주기

출력 − 최대 길이 주기는 − 5

입니다.

설명 − 왼쪽 서브트리의 최대 높이는 3이고 오른쪽 서브트리의 최대 높이는 1입니다. 사이클 길이는 3+1+1=5가 됩니다. 주기는 1-2-3-4-6 또는 1-6-4-3-2입니다.

입력 - 나무

C++에서 이진 트리의 두 노드를 결합하여 형성할 수 있는 최대 길이 주기

출력 − 최대 길이 주기는 − 7입니다.

설명 − 왼쪽 서브트리의 최대 높이는 3이고 오른쪽 서브트리의 최대 높이는 3입니다. 사이클 길이는 3+3+1=7이 됩니다. 주기는 5-4-2-1-8-7-6 또는 5-6-7-8-1-2-4-5입니다.

아래 프로그램에서 사용된 접근 방식은 다음과 같습니다.

  • 공개 데이터 멤버가 있는 클래스 트리 노드를 만듭니다. 노드의 가중치에 대한 int 데이터, 다른 노드를 가리키는 왼쪽 및 오른쪽 트리 노드 포인터입니다.

  • 함수 newNode(int data)는 데이터를 매개변수로 받아 왼쪽 및 오른쪽 포인터가 NULL인 노드를 생성합니다.

  • newnode() 함수를 호출하여 트리를 생성합니다.

  • 함수 maxheight(treenode* root)는 트리의 루트를 가져와 루트에 있는 트리의 최대 높이를 반환합니다.

  • 이 함수는 루트가 NULL인지 확인하고 높이가 0임을 의미하고 0을 반환합니다.

  • lheight 및 rheight는 maxheight(root->left)에 대한 재귀 호출을 통해 노드 루트의 왼쪽 및 오른쪽 하위 트리 높이를 계산합니다. 및 최대 높이(루트->오른쪽);

  • 높이와 높이를 비교하여 얻은 최대값을 반환합니다.

  • main 내부에는 treeNode의 왼쪽 서브트리와 오른쪽 서브트리의 최대 높이 값을 저장합니다.

  • 이제 최대 길이 주기는 루트 자체를 포함하여 최대 높이 + 최대 높이+1의 합계입니다.

  • 결과적으로 주기의 길이를 인쇄하십시오.

예시

#include <bits/stdc++.h>
using namespace std;
//class for tree
class treenode{
public:
   int data;
   treenode* left;
   treenode* right;
};
//find maximum height between left and right subtree of current root
int maxheight(treenode* root){
   if (root == NULL)
      return 0;
   else{
      int lheight = maxheight(root->left);
      int rheight = maxheight(root->right);
      //find maximum height
      if (lheight > rheight)
         return(lheight + 1);
      else
         return(rheight + 1);
      }
   }
   //creating a node of tree
   treenode* newNode(int data){
      treenode* Node = new treenode();
      Node->data = data;
      Node->left = NULL;
      Node->right = NULL;
      return(Node);
}
int main(){
   treenode *root = newNode(6);
   root->left = newNode(8);
   root->right = newNode(9);
   root->left->left = newNode(4);
   root->left->right = newNode(5);
   root->left->right->right = newNode(7);
   root->left->right->right->left = newNode(2);
   int maxlheight=maxheight(root->left);
   int maxrheight=maxheight(root->right);
   int maxlheight=maxDepth(root->left);
   int maxrheight=maxDepth(root->right);
   cout << "Maximum length cycle: " << maxlheight+maxrheight+1;
   return 0;
}

출력

Maximum length cycle: 6