将所有更大的值添加到给定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; }