Top three elements in binary tree

We have a simple binary tree and we have to print the top 3 largest elements present in the binary tree.

Examples:

Input : 
          1
         /  \
        2    3
       / \   / \
      4  5   4  5
Output :Three largest elements are 5 4 3

Approach We can simply take three variables first, second, third to store the first largest, second largest, third largest respectively and perform preorder traversal and each time we will update the elements accordingly.
This approach will take O(n) time only.

Algorithm-

1- Take 3 variables first, second, third
2- Perform a preorder traversal
    if (root==NULL)
         return
    if root's data is larger then first
         update third with second
         second with first
         first with root's data
    else if root's data is larger then 
         second and not equal to first
            update third with second
            second with root's data
    else if root's data is larger then 
         third and not equal to first & 
         second
            update third with root's data
3- call preorder for root->left
4- call preorder for root->right
filter_none

edit
close

play_arrow

link
brightness_4
code

// CPP program to find largest three elements in
// a binary tree.
#include <bits/stdc++.h>
using namespace std;
  
struct Node {
  int data;
  struct Node *left;
  struct Node *right;
};
  
/* Helper function that allocates a new Node with the
   given data and NULL left and right pointers. */
struct Node *newNode(int data) {
  struct Node *node = new Node;
  node->data = data;
  node->left = NULL;
  node->right = NULL;
  return (node);
}
  
// function to find three largest element
void threelargest(Node *root, int &first, int &second, 
                                          int &third) {
  if (root == NULL)
    return;
  
  // if data is greater than first large number
  // update the top three list
  if (root->data > first) {
    third = second;
    second = first;
    first = root->data;
  }
  
  // if data is greater than second large number
  // and not equal to first update the bottom 
  // two list
  else if (root->data > second && root->data != first) {
    third = second;
    second = root->data;
  }
  
  // if data is greater than third large number
  // and not equal to first & second update the 
  // third highest list
  else if (root->data > third && 
           root->data != first && 
           root->data != second)
    third = root->data;
  
  threelargest(root->left, first, second, third);
  threelargest(root->right, first, second, third);
}
  
// driver function
int main() {
  struct Node *root = newNode(1);
  root->left = newNode(2);
  root->right = newNode(3);
  root->left->left = newNode(4);
  root->left->right = newNode(5);
  root->right->left = newNode(4);
  root->right->right = newNode(5);
  
  int first = 0, second = 0, third = 0;
  threelargest(root, first, second, third);
  cout << "three largest elements are " 
       << first << " " << second << " "
       << third;
  return 0;
}

chevron_right


Output:

three largest elements are 5 4 3


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.