任意の二分木を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
-
C++の二分木で最大垂直和を見つける
二分木があるとします。タスクは、垂直順序トラバーサルのすべてのノードの合計の最大値を出力することです。したがって、ツリーが以下のようになっている場合- 垂直方向の走査は-のようなものです 4 2 1 + 5 + 6 = 12 3 + 8 = 11 7 9 ここでの最大値は12です。アプローチは単純です。垂直順序トラバーサルを実行してから、合計を見つけて最大値を確認します。 例 #include<iostream> #include<map> #include<vector> #include<queue> using namespace
-
C++のバイナリツリーで子の合計プロパティを確認します
二分木があるとします。二分木は、次の特性を満たす場合に有効です。 各ノードには、左右の子の値の合計と同じデータ値が含まれている必要があります。いずれかの側に子がない場合は、0として扱われます。 以下のように、指定されたプロパティを満たすツリーが存在するとします。 これをチェックするそのようなトリックはありません。ノードとその子の両方がプロパティを満たしている場合はツリーを再帰的にトラバースする必要があり、それ以外の場合はfalseを返します。 例 #include <iostream> using namespace std; class node {