将所有更大的值添加到给定BST中的每个节点?

BST或二进制搜索树是二进制树的一种形式,其所有左节点都较小,而所有右节点都大于根值。对于此问题,我们将采用一棵二叉树并向其添加所有大于当前节点的值。“将所有更大的值添加到BST中的每个节点”的问题已简化,因为BST将大于当前节点值的所有节点值添加到该节点值。

将所有更大的值添加到BST问题语句中的每个节点:

给定一个二叉搜索树(BST),我们需要向每个节点添加所有更大值节点的和。

输入值

    10
    /  \
   /    \
  5     20
 / \   / \
1   7   1  5

输出结果

      70
    /   \
   82   45
  / \   / \
83 77  60 25

说明

该程序会将BST转换为二叉树,其节点值为所有更大元素的总和加上节点的原始值。

在二进制搜索树解决方案中,将所有更大的值添加到每个节点:

我们使用反向有序遍历(首先在右子树上而不是在左子树上调用递归),并维护一个变量以存储到目前为止已遍历的节点的总和。

然后,我们使用此总和来修改当前节点的值,方法是先将其值添加到总和中,然后用该总和替换节点的值。

示例

#include <iostream >
using namespace std;
struct node {
   int data;
   node *left;
   node *right;
};
node *newNode(int key) {
   node *temp=new node;
   temp->left=NULL;
   temp->right=NULL;
   temp->data=key;
   return temp;
}
void Inorder(node *root) {
   if(!root)
      return;
   Inorder(root->left);
   cout<<root->data<<" ";
   Inorder(root->right);
}
node *Insert(node *root,int key) {
   if(!root)
      return newNode(key);
   if(key<root->data)
      root->left=Insert(root->left,key);
   else
      root->right=Insert(root->right,key);
   return root;
}
void RevInorderAdd(node *root,int &sum) {
   if(!root)
      return;
   RevInorderAdd(root->right,sum);
   sum+=root->data;
   root->data=sum;
   RevInorderAdd(root->left,sum);
}
void AddGreater(node *root) {
   int sum=0;
   RevInorderAdd(root,sum);
}
int main() {
   /* Let us create following BST
      10
      / \
     5   20
    / \  / \
  1  7 15 25 */
   node *root = NULL;
   root = Insert(root, 10);
   Insert(root, 20);
   Insert(root, 25);
   Insert(root, 15);
   Insert(root, 5);
   Insert(root, 7);
   Insert(root, 1);
   Inorder(root);
   cout<<endl;
   AddGreater(root);
   Inorder(root);
   cout<<endl;
   return 0;
}