在本教程中,我们将讨论将任意二叉树转换为具有子代sum属性的树的程序。
为此,我们将提供一个二叉树。我们的任务是将其转换为跟随子代sum属性的二叉树。但是限制是我们只能增加节点中存在的值,而不能改变树的结构或减少节点中的值。
#include<iostream>
#include<bits/stdc++.h>
using namespace std;
//二叉树的节点结构
class node{
public:
int data;
node* left;
node* right;
//创建新节点
node(int data){
this->data = data;
this->left = NULL;
this->right = NULL;
}
};
//递增左子树
void increment(node* node, int diff);
//转换树的主要功能
void convert_Btree(node* node){
int left_data = 0, right_data = 0, diff;
//如果是root,则返回true-
//或叶节点
if (node == NULL || (node->left == NULL &&
node->right == NULL))
return;
else {
//转换左右子树
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;
//让孩子求和
diff = left_data + right_data - node->data;
//如果子项总和大于节点数据
if (diff > 0)
node->data = node->data + diff;
if (diff > 0)
increment(node, -diff);
}
}
//增加节点值
void increment(node* node, int diff){
if(node->left != NULL) {
node->left->data = node->left->data + diff;
//在树中递归移动
increment(node->left, diff);
}
else if (node->right != NULL) {
node->right->data = node->right->data + diff;
increment(node->right, diff);
}
}
//打印顺序遍历
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