C ++
 Computer >> コンピューター >  >> プログラミング >> C ++

C++で二分木の2つのノードを結合することによって形成できる最大長サイクル


二分木が与えられます。目標は、指定されたツリーで最大の長さのサイクルを見つけることです。これを行うには、ルートノードから左側のサブツリーと右側のサブツリーの最大の高さを見つけ、これらの最大長のパスを結合して最長のサイクルを取得します。

C++で二分木の2つのノードを結合することによって形成できる最大長サイクル

上記のツリーの場合、最大長サイクルは1-2-3-4-7-6または1-6-7-4-3-2-1です。長さは6です。

入力 −ツリー

C++で二分木の2つのノードを結合することによって形成できる最大長サイクル

出力 −最大長サイクルは− 5

説明 −左側のサブツリーの最大高さは3、右側のサブツリーの最大高さは1です。サイクルの長さは3 + 1 + 1=5になります。サイクルは1-2-3-4-6または1-6-4-3-2

入力 −ツリー

C++で二分木の2つのノードを結合することによって形成できる最大長サイクル

出力 −最大長サイクルは− 7

説明 −左側のサブツリーの最大高さは3で、右側のサブツリーの最大高さは3です。サイクルの長さは3 + 3 + 1=7になります。サイクルは5-4-2-1-8-7-6または5-6-7-8-1-2-4-5

以下のプログラムで使用されているアプローチは次のとおりです

  • パブリックデータメンバーを持つクラスtreenodeを作成します-ノードの重みのintデータ、他のそのようなノードを指す左右のtreenodeポインター。

  • 関数newNode(int data)は、データをパラメーターとして受け取り、左右のポインターをNULLとして持つノードを作成します。

  • newnode()関数を呼び出してツリーを作成します。

  • 関数maxheight(treenode * root)はツリーのルートを取得し、ルートをルートとするツリーの最大高さを返します。

  • この関数は、ルートがNULLであるかどうかをチェックします。つまり、高さが0であり、0を返します。

  • lheightとrheightは、maxheight(root-> left);を再帰的に呼び出すことにより、ノードルートの左右のサブツリーの高さを計算します。およびmaxheight(root-> right);

  • lheightとrheightを比較して得られた最大値を返します。

  • main内に、treeNodeの左側のサブツリーと右側のサブツリーの最大の高さの値を格納します。

  • これで、最大長サイクルは、ルート自体を含めたmaxlheight + maxrheight+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

  1. C++で二分木の2つのノード間の距離を見つける

    ノードが少ない二分木があると考えてください。 2つのノードuとvの間の距離を見つける必要があります。ツリーが次のようになっていると仮定します- これで、(4、6)=4の間の距離、パスの長さは4、(5、8)の間の長さ=5などになります。 この問題を解決するために、LCA(Lowest Common Ancestor)を見つけてから、LCAから2つのノードまでの距離を計算します。 例 #include<iostream> using namespace std; class Node {    public:       in

  2. C ++の1つのスタックを使用して、リーフノードを左から右にバイナリツリーで印刷します。

    プログラムは、バイナリツリーのリーフノードを左から右に出力する必要がありますが、課題は1つのスタックのみを使用することです push()関数を使用してバイナリツリーのノードを挿入し、pop()操作を使用してリーフノードを表示します。 リーフノードは、左右のポインタがNULLであるエンドノードです。これは、特定のノードが親ノードではないことを意味します。 例 Input : 12 21 32 41 59 33 70 Output : 41 59 33 70 スタックはLIFO構造であるデータ構造であり、トップポインターが最後に挿入された要素を指すため、リーフノードは最後にスタックに挿