bst或二叉搜索树是一种二叉树形式,其中所有左节点的值小于根节点的值,所有右节点的值大于根节点的值。对于这个问题,我们将取一个二叉树并将所有大于当前节点值的值添加到它中。问题“向bst的每个节点添加所有较大的值”被简化为对于bst,将所有大于当前节点值的节点值添加到该节点值。
向bst中的每个节点添加所有较大的值问题陈述:
给定一个二叉搜索树(bst),我们需要为每个节点添加所有较大值节点的总和。
输入 10 / \ / \ 5 20 / \ / \1 7 1 5
输出 70 / \ 82 45 / \ / \83 77 60 25
解释这个程序将把一个二叉搜索树转换为一个二叉树,其中节点的值为所有较大元素的和加上节点的原始值。
将所有较大的值添加到二叉搜索树解决方案中的每个节点:
我们使用逆向中序遍历(先递归调用右子树而不是左子树),并维护一个变量来存储到目前为止已经遍历过的节点的和。
然后,我们使用这个和来修改当前节点的值,首先将其值加到和上,然后用这个和替换节点的值。
示例#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;}
以上就是将给定二叉搜索树中的所有较大值添加到每个节点上的详细内容。