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

任意の二分木をC++でChildrenSumプロパティを保持するツリーに変換します


このチュートリアルでは、任意の二分木を子の合計プロパティを保持するツリーに変換するプログラムについて説明します。

このために、バイナリツリーが提供されます。私たちのタスクは、それを子の合計プロパティに従う二分木に変換することです。ただし、制限は、ノードに存在する値のみをインクリメントでき、ツリーの構造を変更したり、ノードの値をデクリメントしたりすることはできないということです。

#include<iostream>
#include<bits/stdc++.h>
using namespace std;
//node structure for binary tree
class node{
   public:
   int data;
   node* left;
   node* right;
   //creation of new node
   node(int data){
      this->data = data;
      this->left = NULL;
      this->right = NULL;
   }
};
//incrementing left subtree
void increment(node* node, int diff);
//main function converting the tree
void convert_Btree(node* node){
   int left_data = 0, right_data = 0, diff;
   //returning true in case of root
   //or leaf node
   if (node == NULL || (node->left == NULL &&
   node->right == NULL))
   return;
   else {
      //converting left and right subtrees
      convert_Btree(node->left);
      convert_Btree(node->right);
      if (node->left != NULL)
         left_data = node->left->data;
      if (node->right != NULL)
         right_data = node->right->data;
      //getting children sum
      diff = left_data + right_data - node->data;
      //if children sum is greater than node data
      if (diff > 0)
         node->data = node->data + diff;
      if (diff > 0)
         increment(node, -diff);
   }
}
//incrementing the node value
void increment(node* node, int diff){
   if(node->left != NULL) {
      node->left->data = node->left->data + diff;
      //moving recursively in the tree
      increment(node->left, diff);
   }
   else if (node->right != NULL) {
      node->right->data = node->right->data + diff;
      increment(node->right, diff);
   }
}
//printing inorder traversal
void printInorder(node* node){
   if (node == NULL)
      return;
   printInorder(node->left);
   cout<<node->data<<" ";
   printInorder(node->right);
}
int main(){
   node *root = new node(50);
   root->left = new node(7);
   root->right = new node(2);
   root->left->left = new node(3);
   root->left->right = new node(5);
   root->right->left = new node(1);
   root->right->right = new node(30);
   cout << "Before conversion: " << endl;
   printInorder(root);
   convert_Btree(root);
   cout << "\nAfter conversion: " << endl;
   printInorder(root);
   return 0;
}

出力

Before conversion:
3 7 5 50 1 2 30
After conversion:
14 19 5 50 1 31 30

  1. C++の二分木で最大垂直和を見つける

    二分木があるとします。タスクは、垂直順序トラバーサルのすべてのノードの合計の最大値を出力することです。したがって、ツリーが以下のようになっている場合- 垂直方向の走査は-のようなものです 4 2 1 + 5 + 6 = 12 3 + 8 = 11 7 9 ここでの最大値は12です。アプローチは単純です。垂直順序トラバーサルを実行してから、合計を見つけて最大値を確認します。 例 #include<iostream> #include<map> #include<vector> #include<queue> using namespace

  2. C++のバイナリツリーで子の合計プロパティを確認します

    二分木があるとします。二分木は、次の特性を満たす場合に有効です。 各ノードには、左右の子の値の合計と同じデータ値が含まれている必要があります。いずれかの側に子がない場合は、0として扱われます。 以下のように、指定されたプロパティを満たすツリーが存在するとします。 これをチェックするそのようなトリックはありません。ノードとその子の両方がプロパティを満たしている場合はツリーを再帰的にトラバースする必要があり、それ以外の場合はfalseを返します。 例 #include <iostream> using namespace std; class node {