# Sum of k largest elements in BST

Given a BST, the task is to find the sum of all elements greater than and equal to kth largest element.

Examples:

```Input : K = 3
8
/   \
7     10
/      /   \
2      9     13
Output : 32
Explanation: 3rd largest element is 9 so sum of all
elements greater than or equal to 9 are
9 + 10 + 13 = 32.

Input : K = 2
8
/   \
5    11
/  \
2    7
\
3
Output : 19
Explanation: 2nd largest element is 8 so sum of all
elements greater than or equal to 8 are
8 + 11 = 19.
```

Approach:
The idea is to traverse BST in Inorder traversal in a reverse way (Right Root Left).
Note that Inorder traversal of BST accesses elements in a sorted (or increasing) order, hence the reverse of inorder traversal will be in a sorted order(decreasing). While traversing, keep track of the count of visited Nodes and keep adding Nodes until the count becomes k.

 `// C++ program to find Sum Of All Elements larger ` `// than or equal to Kth Largest Element In BST ` `#include ` `using` `namespace` `std; ` ` `  `struct` `Node { ` `    ``int` `data; ` `    ``Node *left, *right; ` `}; ` ` `  `// utility function new Node of BST ` `struct` `Node* cNode(``int` `data) ` `{ ` `    ``Node* node = ``new` `Node; ` `    ``node->left = NULL; ` `    ``node->right = NULL; ` `    ``node->data = data; ` `    ``return` `node; ` `} ` ` `  `// A utility function to insert a new Node ` `// with given key in BST  ` `struct` `Node* add(Node* root, ``int` `key) ` `{ ` `    ``// If the tree is empty, return a new Node ` `    ``if` `(root == NULL) ` `        ``return` `cNode(key); ` ` `  `    ``// Otherwise, recur down the tree ` `    ``if` `(root->data > key) ` `        ``root->left = add(root->left, key); ` ` `  `    ``else` `if` `(root->data < key) ` `        ``root->right = add(root->right, key); ` ` `  `    ``// return the (unchanged) Node pointer ` `    ``return` `root; ` `} ` ` `  `// function to return sum of all elements larger than ` `// and equal to Kth largest element ` `int` `klargestElementSumUtil(Node* root, ``int` `k, ``int``& c) ` `{ ` `    ``// Base cases ` `    ``if` `(root == NULL) ` `        ``return` `0; ` `    ``if` `(c > k) ` `        ``return` `0; ` ` `  `    ``// Compute sum of elements in right subtree ` `    ``int` `ans = klargestElementSumUtil(root->right, k, c); ` `    ``if` `(c >= k) ` `        ``return` `ans; ` ` `  `    ``// Add root's data ` `    ``ans += root->data; ` ` `  `    ``// Add current Node ` `    ``c++; ` `    ``if` `(c >= k) ` `        ``return` `ans; ` ` `  `    ``// If c is less than k, return left subtree Nodes ` `    ``return` `ans + klargestElementSumUtil(root->left, k, c); ` `} ` ` `  `// Wrapper over klargestElementSumRec() ` `int` `klargestElementSum(``struct` `Node* root, ``int` `k) ` `{ ` `    ``int` `c = 0; ` `    ``klargestElementSumUtil(root, k, c); ` `} ` ` `  `// Drivers code ` `int` `main() ` `{ ` `    ``/*   19 ` `        ``/    \ ` `       ``7     21 ` `     ``/   \ ` `    ``3     11 ` `         ``/   \ ` `        ``9    13 ` `          ``*/` ` `  `    ``Node* root = NULL; ` `    ``root = add(root, 19); ` `    ``root = add(root, 7); ` `    ``root = add(root, 3); ` `    ``root = add(root, 11); ` `    ``root = add(root, 9); ` `    ``root = add(root, 13); ` `    ``root = add(root, 21); ` ` `  `    ``int` `k = 2; ` `    ``cout << klargestElementSum(root, k) << endl; ` `    ``return` `0; ` `} `

Output:

`40`

My Personal Notes arrow_drop_up Check out this Author's contributed articles.

If you like GeeksforGeeks and would like to contribute, you can also write an article using contribute.geeksforgeeks.org or mail your article to contribute@geeksforgeeks.org. See your article appearing on the GeeksforGeeks main page and help other Geeks.

Please Improve this article if you find anything incorrect by clicking on the "Improve Article" button below.

Article Tags :
Practice Tags :

Be the First to upvote.

Please write to us at contribute@geeksforgeeks.org to report any issue with the above content.