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++
#include <bits/stdc++.h>
using namespace std;
struct Node {
int data;
Node *left, *right;
};
struct Node* cNode( int data)
{
Node* node = new Node;
node->left = NULL;
node->right = NULL;
node->data = data;
return node;
}
struct Node* add(Node* root, int key)
{
if (root == NULL)
return cNode(key);
if (root->data > key)
root->left = add(root->left, key);
else if (root->data < key)
root->right = add(root->right, key);
return root;
}
int klargestElementSumUtil(Node* root, int k, int & c)
{
if (root == NULL)
return 0;
if (c > k)
return 0;
int ans = klargestElementSumUtil(root->right, k, c);
if (c >= k)
return ans;
ans += root->data;
c++;
if (c >= k)
return ans;
return ans + klargestElementSumUtil(root->left, k, c);
}
int klargestElementSum( struct Node* root, int k)
{
int c = 0;
klargestElementSumUtil(root, k, c);
}
int main()
{
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;
}
|
Java
import java.util.*;
class GFG
{
static class Node
{
int data;
Node left, right;
};
static int c;
static Node cNode( int data)
{
Node node = new Node();
node.left = null ;
node.right = null ;
node.data = data;
return node;
}
static Node add(Node root, int key)
{
if (root == null )
return cNode(key);
if (root.data > key)
root.left = add(root.left, key);
else if (root.data < key)
root.right = add(root.right, key);
return root;
}
static int klargestElementSumUtil(Node root, int k)
{
if (root == null )
return 0 ;
if (c > k)
return 0 ;
int ans = klargestElementSumUtil(root.right, k);
if (c >= k)
return ans;
ans += root.data;
c++;
if (c >= k)
return ans;
return ans + klargestElementSumUtil(root.left, k);
}
static int klargestElementSum(Node root, int k)
{
c = 0 ;
return klargestElementSumUtil(root, k);
}
public static void main(String[] args)
{
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 ;
System.out.print(klargestElementSum(root, k) + "\n" );
}
}
|
Python3
c = 0
class cNode:
def __init__( self , data):
self .data = data
self .left = None
self .right = None
def add(root, key):
if (root = = None ):
return cNode(key)
if (root.data > key):
root.left = add(root.left, key)
elif (root.data < key):
root.right = add(root.right, key)
return root
def klargestElementSumUtil(root, k):
global c
if (root = = None ):
return 0
if (c > k):
return 0
ans = klargestElementSumUtil(root.right, k)
if (c > = k):
return ans
ans + = root.data
c + = 1
if (c > = k):
return ans
return ans + klargestElementSumUtil(root.left, k)
def klargestElementSum(root, k):
return klargestElementSumUtil(root, k)
if __name__ = = '__main__' :
root = None
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 )
k = 2
print (klargestElementSum(root, k))
|
C#
using System;
class GFG
{
class Node
{
public int data;
public Node left, right;
};
static int c;
static Node cNode( int data)
{
Node node = new Node();
node.left = null ;
node.right = null ;
node.data = data;
return node;
}
static Node add(Node root, int key)
{
if (root == null )
return cNode(key);
if (root.data > key)
root.left = add(root.left, key);
else if (root.data < key)
root.right = add(root.right, key);
return root;
}
static int klargestElementSumUtil(Node root, int k)
{
if (root == null )
return 0;
if (c > k)
return 0;
int ans = klargestElementSumUtil(root.right, k);
if (c >= k)
return ans;
ans += root.data;
c++;
if (c >= k)
return ans;
return ans + klargestElementSumUtil(root.left, k);
}
static int klargestElementSum(Node root, int k)
{
c = 0;
return klargestElementSumUtil(root, k);
}
public static void Main(String[] args)
{
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;
Console.Write(klargestElementSum(root, k) + "\n" );
}
}
|
Javascript
<script>
class Node
{
constructor(data)
{
this .left = null ;
this .right = null ;
this .data = data;
}
}
let c;
function cNode(data)
{
let node = new Node(data);
return node;
}
function add(root, key)
{
if (root == null )
return cNode(key);
if (root.data > key)
root.left = add(root.left, key);
else if (root.data < key)
root.right = add(root.right, key);
return root;
}
function klargestElementSumUtil(root, k)
{
if (root == null )
return 0;
if (c > k)
return 0;
let ans = klargestElementSumUtil(root.right, k);
if (c >= k)
return ans;
ans += root.data;
c++;
if (c >= k)
return ans;
return ans + klargestElementSumUtil(root.left, k);
}
function klargestElementSum(root, k)
{
c = 0;
return klargestElementSumUtil(root, k);
}
let 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);
let k = 2;
document.write(
klargestElementSum(root, k) + "</br>" );
</script>
|
Output:
40