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

C++のバイナリツリーで最長のZigZagパス


二分木のルートがあるとすると、二分木のZigZagパスは次のように定義されます-

  • 二分木の任意のノードと方向(右または左)を選択します。

  • 現在の方向が正しい場合は、現在のノードの右の子に向かって移動します。それ以外の場合は、左の子に向かって移動します。

  • 次に、方向を右から左に、またはその逆に変更します。

  • ツリー内を移動できなくなるまで、2番目と3番目の手順を繰り返します。

ここで、ジグザグの長さは、訪問したノードの数-1として定義されます(単一のノードの長さは0です)。そのツリーに含まれる最長のZigZagパスを見つける必要があります。たとえば、ツリーが-

のような場合

C++のバイナリツリーで最長のZigZagパス

(右、左、右)

のように、出力は3になります。

これを解決するには、次の手順に従います-

  • dfs()と呼ばれるメソッドを定義します。これはrootとleftBを取ります

  • ルートがnullの場合、-1を返します

  • ルートがツリー内の1つのノードのみである場合は、0を返します

  • leftV:=dfs(ルートの左、true)およびrightV:=dfs(ルートの右、false)

  • ret:=retの最大値および(1 + leftVおよびrightVの最大値)

  • leftBが0でない場合は、1 + rightVを返し、そうでない場合は1 + leftV

    を返します。
  • mainメソッドから、ret:=0

    を設定します。
  • dfs(root、true)を呼び出し、dfs(root、false)を呼び出します

  • retを返す

例(C ++)

理解を深めるために、次の実装を見てみましょう-

#include <bits/stdc++.h>
using namespace std;
class TreeNode{
   public:
   int val;
   TreeNode *left, *right;
   TreeNode(int data){
      val = data;
      left = right = NULL;
   }
};
void insert(TreeNode **root, int val){
   queue<TreeNode*> q;
   q.push(*root);
   while(q.size()){
      TreeNode *temp = q.front();
      q.pop();
      if(!temp->left){
         if(val != NULL)
            temp->left = new TreeNode(val);
         else
            temp->left = new TreeNode(0);
         return;
         } else {
            q.push(temp->left);
         }
         if(!temp->right){
            if(val != NULL)
               temp->right = new TreeNode(val);
            else
               temp->right = new TreeNode(0);
            return;
            }else{
               q.push(temp->right);
            }
         }
   }
   TreeNode *make_tree(vector<int> v){
      TreeNode *root = new TreeNode(v[0]);
      for(int i = 1; i<v.size(); i++){
      insert(&root, v[i]);
   }
   return root;
}
class Solution {
   public:
   int ret;
   int dfs(TreeNode* root, bool leftB){
      if(!root) return -1;
      if(!root->left && !root->right) return 0;
      int leftV = dfs(root->left, true);
      int rightV = dfs(root->right, false);
      ret = max(ret, 1 + max(leftV, rightV));
      if(leftB) return 1 + rightV;
         return 1 + leftV;
   }
   int longestZigZag(TreeNode* root) {
      ret = 0;
      dfs(root, true);
      dfs(root, false);
      return ret;
   }
};
main(){
   vector<int> v = {1,NULL,1,1,1,NULL,NULL,1,1,NULL,1,NULL,NULL,NULL,1,NULL,1};
   TreeNode *root = make_tree(v);
   Solution ob;
   cout << (ob.longestZigZag(root));
}

入力

[1,null,1,1,1,null,null,1,1,null,1,null,null,null,1,null,1]

出力

3

  1. C++のバイナリツリーの最大パス合計

    この問題では、各ノードに値が含まれる二分木が与えられます。私たちのタスクは、二分木の2つの葉の間の最大パスの合計を見つけるプログラムを作成することです。 ここでは、値の最大合計を提供する、あるリーフノードから別のリーフノードへのパスを見つける必要があります。この最大合計パスには、ルートノードを含めることができます/含めることができません。 二分木 は、各ノードが最大2つの子ノードを持つことができるツリーデータ構造です。これらは左の子と右の子と呼ばれます。 例 − 問題を理解するために例を見てみましょう- 入力 −//二分木… 出力 − 24 説明 −リーフノード− 2から9へ

  2. Pythonのジグザグラベル付き二分木のパス

    すべてのノードに2つの子がある無限の二分木で、ノードに行順にラベルが付けられているとします。奇数行(1、3、5、...)では、ラベル付けは左から右になり、偶数行(2、4、6、...)では、ラベル付けは右から左になります。 。したがって、ツリーは次のようになります- したがって、このツリーでノードのラベルを付けたので、ツリーのルートからそのラベルの付いたノードまでのパスでラベルを見つける必要があります。したがって、入力がlabel =14の場合、出力は[1,3,4,14]になります。 これを解決するには、次の手順に従います- 2つの配列ツリーと解像度を定義し、ツリー配列に0と1を