Open In App

Count of nodes that are greater than Ancestors

Last Updated : 12 Jul, 2025
Comments
Improve
Suggest changes
Like Article
Like
Report

Given the root of a tree, the task is to find the count of nodes which are greater than all of its ancestors.
Examples: 

Input: 
4
/ \
5 2
/ \
3 6
Output: 3
The nodes are 4, 5 and 6.

Input:
10
/ \
8 6
\ \
3 5
/
1
Output: 1

Approach: The problem can be solved using dfs. In every function call, pass a variable maxx which stores the maximum among all the nodes traversed so far, and every node whose value is greater than maxx is the node that satisfies the given condition. Hence, increment the count.
Below is the implementation of the above approach: 
 

C++
// C++ implementation of the approach
#include <bits/stdc++.h>
using namespace std;

// Structure for the node of the tree
struct Tree {
    int val;
    Tree* left;
    Tree* right;
    Tree(int _val)
    {
        val = _val;
        left = NULL;
        right = NULL;
    }
};

// Dfs Function
void dfs(Tree* node, int maxx, int& count)
{
    // Base case
    if (node == NULL) {
        return;
    }
    else {

        // Increment the count if the current
        // node's value is greater than the
        // maximum value in it's ancestors
        if (node->val > maxx)
            count++;

        // Left traversal
        dfs(node->left, max(maxx, node->val), count);

        // Right traversal
        dfs(node->right, max(maxx, node->val), count);
    }
}

// Driver code
int main()
{

    Tree* root = new Tree(4);
    root->left = new Tree(5);
    root->right = new Tree(2);
    root->right->left = new Tree(3);
    root->right->right = new Tree(6);

    // To store the required count
    int count = 0;

    dfs(root, INT_MIN, count);

    cout << count;

    return 0;
}
Java
// Java implementation of the approach
class GFG
{

static int count;

// Structure for the node of the tree
static class Tree
{
    int val;
    Tree left;
    Tree right;
    Tree(int _val)
    {
        val = _val;
        left = null;
        right = null;
    }
};

// Dfs Function
static void dfs(Tree node, int maxx)
{
    // Base case
    if (node == null)
    {
        return;
    }
    else 
    {

        // Increment the count if the current
        // node's value is greater than the
        // maximum value in it's ancestors
        if (node.val > maxx)
            count++;

        // Left traversal
        dfs(node.left, Math.max(maxx, node.val));

        // Right traversal
        dfs(node.right, Math.max(maxx, node.val));
    }
}

// Driver code
public static void main(String[] args)
{
    Tree root = new Tree(4);
    root.left = new Tree(5);
    root.right = new Tree(2);
    root.right.left = new Tree(3);
    root.right.right = new Tree(6);

    // To store the required count
    count = 0;

    dfs(root, Integer.MIN_VALUE);

    System.out.print(count);
}
}

// This code is contributed by 29AjayKumar
Python
# Python3 program for the 
# above approach
from collections import deque

# A Tree node
class Tree:
  
    def __init__(self, x):
      
        self.val = x
        self.left = None
        self.right = None

count = 0

# Dfs Function
def dfs(node, maxx):
  
    global count
    
    # Base case
    if (node == None):
        return
    else:

        # Increment the count if
        # the current node's value 
        # is greater than the maximum 
        # value in it's ancestors
        if (node.val > maxx):
            count += 1

        # Left traversal
        dfs(node.left, 
            max(maxx, 
                node.val))

        # Right traversal
        dfs(node.right, 
            max(maxx, 
                node.val))
        
# Driver code
if __name__ == '__main__':

    root = Tree(4)
    root.left = Tree(5)
    root.right = Tree(2)
    root.right.left = Tree(3)
    root.right.right = Tree(6)

    # To store the required
    # count
    count = 0

    dfs(root, 
        -10 ** 9)
    print(count)

# This code is contributed by Mohit Kumar 29
C#
// C# implementation of the approach
using System;

class GFG
{
static int count;

// Structure for the node of the tree
public class Tree
{
    public int val;
    public Tree left;
    public Tree right;
    public Tree(int _val)
    {
        val = _val;
        left = null;
        right = null;
    }
};

// Dfs Function
static void dfs(Tree node, int maxx)
{
    // Base case
    if (node == null)
    {
        return;
    }
    else
    {

        // Increment the count if the current
        // node's value is greater than the
        // maximum value in it's ancestors
        if (node.val > maxx)
            count++;

        // Left traversal
        dfs(node.left, Math.Max(maxx, node.val));

        // Right traversal
        dfs(node.right, Math.Max(maxx, node.val));
    }
}

// Driver code
public static void Main(String[] args)
{
    Tree root = new Tree(4);
    root.left = new Tree(5);
    root.right = new Tree(2);
    root.right.left = new Tree(3);
    root.right.right = new Tree(6);

    // To store the required count
    count = 0;

    dfs(root, int.MinValue);

    Console.Write(count);
}
}

// This code is contributed by Rajput-Ji
Javascript
<script>
// Javascript implementation of the approach

let count=0;
// Structure for the node of the tree
class Tree
{
    constructor(val)
    {
        this.val=val;
        this.left=this.right=null;
    }
}

// Dfs Function
function dfs(node,maxx)
{
    // Base case
    if (node == null)
    {
        return;
    }
    else
    {
 
        // Increment the count if the current
        // node's value is greater than the
        // maximum value in it's ancestors
        if (node.val > maxx)
            count++;
 
        // Left traversal
        dfs(node.left, Math.max(maxx, node.val));
 
        // Right traversal
        dfs(node.right, Math.max(maxx, node.val));
    }
}

// Driver code
let root = new Tree(4);
root.left = new Tree(5);
root.right = new Tree(2);
root.right.left = new Tree(3);
root.right.right = new Tree(6);

// To store the required count
count = 0;

dfs(root, Number.MIN_VALUE);

document.write(count);


// This code is contributed by unknown2108
</script>

Output
3

Time Complexity: O(N) where N is the number of nodes in given binary tree.

Space Complexity: O(h) where h is the height of binary tree due to stack recursion call.

Approach: Breadth-First Search (BFS) with Tracking Maximum Ancestor Value

This method employs a breadth-first search (BFS) strategy to explore nodes one level at a time, simultaneously recording the
highest value encountered from the root to each node with a queue. For every node, we verify if its value surpasses this
recorded maximum.

Follow the below steps:

  • Intitalize the counter to zero.
  • Apply a queue for BFS, with each item in the queue being a tuple that includes a node and the highest value found on the path leading to that node.
  • For every node, check if its value is greater than the existing highest value.
  • If the node’s value is greater, increment the counter.
  • Update the current maximum value to be the maximum of the current node’s value and the current maximum value.
  • Add the left and right children of the current node to the queue along with the updated maximum value.
  • Return the counter after the traversal is complete.

Below is the implementation of the above approach: 

Python
from collections import deque

# Definition for a binary tree node.
class TreeNode:
    def __init__(self, value=0, left=None, right=None):
        self.value = value
        self.left = left
        self.right = right

# Function to count nodes greater than all of their ancestors using BFS
def count_greater_nodes_bfs(root):
    if not root:
        return 0  # If the tree is empty, return 0
    
    count = 0  # Initialize the counter for nodes greater than all ancestors
    queue = deque([(root, float('-inf'))])  # Initialize the queue with the root node and negative infinity as max value
    
    # Perform BFS
    while queue:
        node, max_value = queue.popleft()  # Get the next node and the max value encountered so far
        
        # Check if the current node's value is greater than the max value encountered so far
        if node.value >= max_value:
            count += 1  # Increment the counter if the condition is satisfied
        
        # Update the max value encountered so far
        new_max_value = max(max_value, node.value)
        
        # Add the left child to the queue if it exists
        if node.left:
            queue.append((node.left, new_max_value))
        
        # Add the right child to the queue if it exists
        if node.right:
            queue.append((node.right, new_max_value))
    
    return count  # Return the final count

# Define the example trees
# Tree 1:
#     4
#    / \
#   5   2
#      / \
#     3   6
root1 = TreeNode(4, TreeNode(5), TreeNode(2, TreeNode(3), TreeNode(6)))

# Tree 2:
#      10
#     /  \
#    8    6
#     \    \
#      3    5
#     /
#    1
root2 = TreeNode(10, TreeNode(8, right=TreeNode(3, left=TreeNode(1))), TreeNode(6, right=TreeNode(5)))

# Test the function with the example trees
print(count_greater_nodes_bfs(root1))  
print(count_greater_nodes_bfs(root2))  

Output
3
1

Time Complexity: O(n) where n is the number of nodes in the tree.

Space Complexity: O(n)


Article Tags :

Similar Reads