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

C++での二分木傾斜


二分木のルートノードがあるとしましょう。タスクは、すべてのノードの傾きの合計を見つけて返すことです。

傾斜 バイナリツリーの例は、各レベルの左側のサブツリーと右側のサブツリーの子ノードの絶対差を見つけることによってバイナリツリーを構築することに他なりません。ある特定のレベル、つまり子ノードを持たないノードでは、そのノードをゼロに置き換えるだけで傾斜します。

入力

C++での二分木傾斜

出力:15

説明: 与えられた二分木のすべてのレベルで傾きを見つける

ノード3の傾き=0

ノード5の傾き=0

ノード7の傾き=0

ノード2の傾き=abs(3-5)=2

ノード9の傾き=abs(0-7)=7

ノード4の傾き=abs((3 + 5 + 2)-(9 + 7))=6

すべてのノードの傾きの合計は=2+ 7 + 6 =15

この問題を解決するためのアプローチ

この特定の問題を解決するための簡単なアプローチは、注文後の幅優先探索トラバーサルを使用することです。

二分木をトラバースしている間、左側のサブツリー、次に右側のサブツリーのすべてのノードの合計を見つけようとします。合計が見つかったら、サブツリーの左の合計と右の合計の絶対差を計算することにより、すべてのノードの傾きを見つけます。

  • 入力となる二分木を取ります。
  • 整数関数sumNodes(treenode * node)は、ツリーのルートノードを取得し、左側のサブツリーと右側のサブツリーの合計を返します。
  • 整数関数findTilt(treenode * root)は、ルートノードを入力パラメーターとして受け取り、すべてのノードの傾きの合計を返します。

#include<iostream>
using namespace std;
struct treenode {
   int data;
   treenode * left;
   treenode * right;
};
struct treenode * createNode(int d) {
   struct treenode * root = new treenode;
   root -> data = d;
   root -> left = NULL;
   root -> right = NULL;
   return root;
}
int sumNodes(treenode * root, int &amp; sum) {
   if (root == NULL) return 0;
   int lsum = sumNodes(root -> left, sum);
   int rsum = sumNodes(root -> right, sum);
   sum += abs(lsum - rsum);
   return lsum + rsum + root -> data;
}
int findTilt(treenode * root) {
   int sum = 0;
   if (root == NULL) {
      return 0;
   }
   sumNodes(root, sum);
   return sum;
}
int main() {
   struct treenode * root = NULL;
   root = createNode(4);
   root -> left = createNode(2);
   root -> right = createNode(9);
   root -> left -> right = createNode(5);
   root -> left -> left = createNode(3);
   root -> right -> right = createNode(7);
   cout << findTilt(root) << endl;
   return 0;
}

上記のコードを実行すると、次のように出力が生成されます

出力

15

与えられた二分木では、ツリーのすべてのレベルでのすべてのノードの傾きの合計は15です。


  1. バイナリツリーをC++のリンクリストにフラット化する

    二分木があるとしましょう。リンクリストにフラット化する必要があります。したがって、ツリーが次のような場合- 出力ツリーは-になります これを解決するには、次の手順に従います- ser prev:=null rootを入力として受け取る再帰関数solve()を定義します。 ルートがnullの場合は、を返します。 解決(ルートの権利) 解決(ルートの左側) ルートの右側:=prev、ルートの左側:=null 前:=ルート 理解を深めるために、次の実装を見てみましょう- 例 #include <bits/stdc+

  2. C++での二分木レベルの順序トラバーサル

    二分木があるとします。レベル順トラバーサルスキームを使用して、このツリーをトラバースする必要があります。したがって、ツリーが次のような場合 トラバーサルシーケンスは次のようになります-[10、5、16、8、15、20、23] これを解決するには、次の手順に従います- ノードを格納するためのキューキューを定義する ルートをキューに挿入します。 queが空でない間は、 item:=キューの最前列にあるアイテム アイテムの価値を印刷する アイテムの左側がnullでない場合は、アイテムの左側をqueに挿入します アイテムの権利がnullでない場合は、アイテムの権利をqueに挿入します