# Find maximum (or minimum) in Binary Tree

Given a Binary Tree, find the maximum(or minimum) element in it. For example, maximum in the following Binary Tree is 9. In Binary Search Tree, we can find maximum by traversing right pointers until we reach the rightmost node. But in Binary Tree, we must visit every node to figure out maximum. So the idea is to traverse the given tree and for every node return maximum of 3 values.

1. Node’s data.
2. Maximum in node’s left subtree.
3. Maximum in node’s right subtree.

Below is the implementation of above approach.

## CPP

 `// C++ program to find maximum and ` `// minimum in a Binary Tree ` `#include ` `#include ` `using` `namespace` `std; ` ` `  `// A tree node ` `class` `Node { ` `public``: ` `    ``int` `data; ` `    ``Node *left, *right; ` ` `  `    ``/* Constructor that allocates a new ` `    ``node with the given data and NULL ` `    ``left and right pointers. */` `    ``Node(``int` `data) ` `    ``{ ` `        ``this``->data = data; ` `        ``this``->left = NULL; ` `        ``this``->right = NULL; ` `    ``} ` `}; ` ` `  `// Returns maximum value in a given ` `// Binary Tree ` `int` `findMax(Node* root) ` `{ ` `    ``// Base case ` `    ``if` `(root == NULL) ` `        ``return` `INT_MIN; ` ` `  `    ``// Return maximum of 3 values: ` `    ``// 1) Root's data 2) Max in Left Subtree ` `    ``// 3) Max in right subtree ` `    ``int` `res = root->data; ` `    ``int` `lres = findMax(root->left); ` `    ``int` `rres = findMax(root->right); ` `    ``if` `(lres > res) ` `        ``res = lres; ` `    ``if` `(rres > res) ` `        ``res = rres; ` `    ``return` `res; ` `} ` ` `  `// Driver Code ` `int` `main() ` `{ ` `    ``Node* NewRoot = NULL; ` `    ``Node* root = ``new` `Node(2); ` `    ``root->left = ``new` `Node(7); ` `    ``root->right = ``new` `Node(5); ` `    ``root->left->right = ``new` `Node(6); ` `    ``root->left->right->left = ``new` `Node(1); ` `    ``root->left->right->right = ``new` `Node(11); ` `    ``root->right->right = ``new` `Node(9); ` `    ``root->right->right->left = ``new` `Node(4); ` ` `  `    ``// Function call ` `    ``cout << ``"Maximum element is "` `<< findMax(root) << endl; ` ` `  `    ``return` `0; ` `} ` ` `  `// This code is contributed by ` `// rathbhupendra`

## C

 `// C program to find maximum and minimum in a Binary Tree ` `#include ` `#include ` `#include ` ` `  `// A tree node ` `struct` `Node { ` `    ``int` `data; ` `    ``struct` `Node *left, *right; ` `}; ` ` `  `// A utility function to create a new node ` `struct` `Node* newNode(``int` `data) ` `{ ` `    ``struct` `Node* node ` `        ``= (``struct` `Node*)``malloc``(``sizeof``(``struct` `Node)); ` `    ``node->data = data; ` `    ``node->left = node->right = NULL; ` `    ``return` `(node); ` `} ` ` `  `// Returns maximum value in a given Binary Tree ` `int` `findMax(``struct` `Node* root) ` `{ ` `    ``// Base case ` `    ``if` `(root == NULL) ` `        ``return` `INT_MIN; ` ` `  `    ``// Return maximum of 3 values: ` `    ``// 1) Root's data 2) Max in Left Subtree ` `    ``// 3) Max in right subtree ` `    ``int` `res = root->data; ` `    ``int` `lres = findMax(root->left); ` `    ``int` `rres = findMax(root->right); ` `    ``if` `(lres > res) ` `        ``res = lres; ` `    ``if` `(rres > res) ` `        ``res = rres; ` `    ``return` `res; ` `} ` ` `  `// Driver code ` `int` `main(``void``) ` `{ ` `    ``struct` `Node* NewRoot = NULL; ` `    ``struct` `Node* root = newNode(2); ` `    ``root->left = newNode(7); ` `    ``root->right = newNode(5); ` `    ``root->left->right = newNode(6); ` `    ``root->left->right->left = newNode(1); ` `    ``root->left->right->right = newNode(11); ` `    ``root->right->right = newNode(9); ` `    ``root->right->right->left = newNode(4); ` ` `  `    ``// Function call ` `    ``printf``(``"Maximum element is %d \n"``, findMax(root)); ` ` `  `    ``return` `0; ` `}`

## Java

 `// Java code to Find maximum (or minimum) in ` `// Binary Tree ` ` `  `// A binary tree node ` `class` `Node { ` `    ``int` `data; ` `    ``Node left, right; ` ` `  `    ``public` `Node(``int` `data) ` `    ``{ ` `        ``this``.data = data; ` `        ``left = right = ``null``; ` `    ``} ` `} ` ` `  `class` `BinaryTree { ` `    ``Node root; ` ` `  `    ``// Returns the max value in a binary tree ` `    ``static` `int` `findMax(Node node) ` `    ``{ ` `        ``if` `(node == ``null``) ` `            ``return` `Integer.MIN_VALUE; ` ` `  `        ``int` `res = node.data; ` `        ``int` `lres = findMax(node.left); ` `        ``int` `rres = findMax(node.right); ` ` `  `        ``if` `(lres > res) ` `            ``res = lres; ` `        ``if` `(rres > res) ` `            ``res = rres; ` `        ``return` `res; ` `    ``} ` ` `  `    ``/* Driver code */` `    ``public` `static` `void` `main(String args[]) ` `    ``{ ` `        ``BinaryTree tree = ``new` `BinaryTree(); ` `        ``tree.root = ``new` `Node(``2``); ` `        ``tree.root.left = ``new` `Node(``7``); ` `        ``tree.root.right = ``new` `Node(``5``); ` `        ``tree.root.left.right = ``new` `Node(``6``); ` `        ``tree.root.left.right.left = ``new` `Node(``1``); ` `        ``tree.root.left.right.right = ``new` `Node(``11``); ` `        ``tree.root.right.right = ``new` `Node(``9``); ` `        ``tree.root.right.right.left = ``new` `Node(``4``); ` ` `  `        ``// Function call ` `        ``System.out.println(``"Maximum element is "` `                           ``+ tree.findMax(tree.root)); ` `    ``} ` `} ` ` `  `// This code is contributed by Kamal Rawal`

## Python3

 `# Python3 program to find maximum ` `# and minimum in a Binary Tree ` ` `  `# A class to create a new node ` ` `  ` `  `class` `newNode: ` `    ``def` `__init__(``self``, data): ` `        ``self``.data ``=` `data ` `        ``self``.left ``=` `self``.right ``=` `None` ` `  `# Returns maximum value in a ` `# given Binary Tree ` ` `  ` `  `def` `findMax(root): ` ` `  `    ``# Base case ` `    ``if` `(root ``=``=` `None``): ` `        ``return` `float``(``'-inf'``) ` ` `  `    ``# Return maximum of 3 values: ` `    ``# 1) Root's data 2) Max in Left Subtree ` `    ``# 3) Max in right subtree ` `    ``res ``=` `root.data ` `    ``lres ``=` `findMax(root.left) ` `    ``rres ``=` `findMax(root.right) ` `    ``if` `(lres > res): ` `        ``res ``=` `lres ` `    ``if` `(rres > res): ` `        ``res ``=` `rres ` `    ``return` `res ` ` `  ` `  `# Driver Code ` `if` `__name__ ``=``=` `'__main__'``: ` `    ``root ``=` `newNode(``2``) ` `    ``root.left ``=` `newNode(``7``) ` `    ``root.right ``=` `newNode(``5``) ` `    ``root.left.right ``=` `newNode(``6``) ` `    ``root.left.right.left ``=` `newNode(``1``) ` `    ``root.left.right.right ``=` `newNode(``11``) ` `    ``root.right.right ``=` `newNode(``9``) ` `    ``root.right.right.left ``=` `newNode(``4``) ` ` `  `    ``# Function call ` `    ``print``(``"Maximum element is"``, ` `          ``findMax(root)) ` ` `  `# This code is contributed by PranchalK `

## C#

 `// C# code to Find maximum (or minimum) in ` `// Binary Tree ` `using` `System; ` ` `  `// A binary tree node ` `public` `class` `Node { ` `    ``public` `int` `data; ` `    ``public` `Node left, right; ` ` `  `    ``public` `Node(``int` `data) ` `    ``{ ` `        ``this``.data = data; ` `        ``left = right = ``null``; ` `    ``} ` `} ` ` `  `public` `class` `BinaryTree { ` `    ``public` `Node root; ` ` `  `    ``// Returns the max value in a binary tree ` `    ``public` `static` `int` `findMax(Node node) ` `    ``{ ` `        ``if` `(node == ``null``) { ` `            ``return` `int``.MinValue; ` `        ``} ` ` `  `        ``int` `res = node.data; ` `        ``int` `lres = findMax(node.left); ` `        ``int` `rres = findMax(node.right); ` ` `  `        ``if` `(lres > res) { ` `            ``res = lres; ` `        ``} ` `        ``if` `(rres > res) { ` `            ``res = rres; ` `        ``} ` `        ``return` `res; ` `    ``} ` ` `  `    ``/* Driver code */` `    ``public` `static` `void` `Main(``string``[] args) ` `    ``{ ` `        ``BinaryTree tree = ``new` `BinaryTree(); ` `        ``tree.root = ``new` `Node(2); ` `        ``tree.root.left = ``new` `Node(7); ` `        ``tree.root.right = ``new` `Node(5); ` `        ``tree.root.left.right = ``new` `Node(6); ` `        ``tree.root.left.right.left = ``new` `Node(1); ` `        ``tree.root.left.right.right = ``new` `Node(11); ` `        ``tree.root.right.right = ``new` `Node(9); ` `        ``tree.root.right.right.left = ``new` `Node(4); ` ` `  `        ``// Function call ` `        ``Console.WriteLine(``"Maximum element is "` `                          ``+ BinaryTree.findMax(tree.root)); ` `    ``} ` `} ` ` `  `// This code is contributed by Shrikant13`

Output

```Maximum element is 11

```

Similarly, we can find the minimum element in a Binary tree by comparing three values. Below is the function to find a minimum in Binary Tree.

## C

 `// Returns minimum value in a given Binary Tree ` `int` `findMin(``struct` `Node* root) ` `{ ` `    ``// Base case ` `    ``if` `(root == NULL) ` `      ``return` `INT_MAX; ` ` `  `    ``// Return minimum of 3 values: ` `    ``// 1) Root's data 2) Max in Left Subtree ` `    ``// 3) Max in right subtree ` `    ``int` `res = root->data; ` `    ``int` `lres = findMin(root->left); ` `    ``int` `rres = findMin(root->right); ` `    ``if` `(lres < res) ` `      ``res = lres; ` `    ``if` `(rres < res) ` `      ``res = rres; ` `    ``return` `res; ` `} `

## Java

 `// Returns the min value in a binary tree ` `static` `int` `findMin(Node node) ` `{ ` `    ``if` `(node == ``null``) ` `        ``return` `Integer.MAX_VALUE; ` ` `  `    ``int` `res = node.data; ` `    ``int` `lres = findMin(node.left); ` `    ``int` `rres = findMin(node.right); ` ` `  `    ``if` `(lres < res) ` `        ``res = lres; ` `    ``if` `(rres < res) ` `        ``res = rres; ` `    ``return` `res; ` `} `

## Python3

 `# Returns the min value in a binary tree ` ` `  `def` `find_min_in_BT(root): ` `    ``if` `root ``is` `None``: ` `        ``return` `float``(``'inf'``) ` `    ``res ``=` `root.data ` `    ``lres ``=` `find_min_in_BT(root.leftChild) ` `    ``rres ``=` `find_min_in_BT(root.rightChild) ` `    ``if` `lres < res: ` `        ``res ``=` `lres ` `    ``if` `rres < res: ` `        ``res ``=` `rres ` `    ``return` `res ` ` `  `# This code is contributed by Subhajit Nandi `

## C#

 `// Returns the min value in a binary tree ` `public` `static` `int` `findMin(Node node) ` `{ ` `    ``if` `(node == ``null``) ` `        ``return` `int``.MaxValue; ` ` `  `    ``int` `res = node.data; ` `    ``int` `lres = findMin(node.left); ` `    ``int` `rres = findMin(node.right); ` ` `  `    ``if` `(lres < res) ` `        ``res = lres; ` `    ``if` `(rres < res) ` `        ``res = rres; ` `    ``return` `res; ` `} ` ` `  `// This code is contributed by Code_Mech `

Complexity Analysis:

Time Complexity : O(N).
In the recursive function calls, every node of the tree is processed once and hence the complexity due to the function is O(N) if there are total N nodes in the tree. Therefore, the time complexity is O(N).

Auxiliary Space : O(1).
Any extra space is not required, so the space complexity is constant.

Attention reader! Don’t stop learning now. Get hold of all the important DSA concepts with the DSA Self Paced Course at a student-friendly price and become industry ready.

My Personal Notes arrow_drop_up

Article Tags :
Practice Tags :

11

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