将任意二叉树转换为包含C ++中的Children Sum属性的树

在本教程中,我们将讨论将任意二叉树转换为具有子代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