Count the number of visible nodes in Binary Tree - GeeksforGeeks

23 Jun, 2021
Given a Binary tree, the task is to find the number of visible nodes in the given binary tree. A node is a visible node if, in the path from the root to the node N, there is no node with greater value than N’s, Examples: 
Input:
      5
     /  \
   3     10
  /  \   /
20   21 1

Output: 4 
Explanation:
There are 4 visible nodes. 
They are:
5: In the path 5 -> 3, 5 is the highest node value.
20: In the path 5 -> 3 -> 20, 20 is the highest node value.
21: In the path 5 -> 3 -> 21, 21 is the highest node value.
10: In the path 5 -> 10 -> 1, 10 is the highest node value. 

Input:
      -1
        \
         -2
           \
            -3
Output: 1
Approach: The idea is to first traverse the tree. Since we need to see the maximum value in the given path, the pre-order traversal is used to traverse the given binary tree. While traversing the tree, we need to keep the track of the maximum value of the node that we have seen so far. If the current node is greater or equal to the max value, then increment the count of the visible node and update the max value with the current node value. Below is the implementation of the above approach:  
C++
Java
Python3
C#
Javascript
// C++ implementation to// count the number of// visible nodes in the// binary tree#include <bits/stdc++.h>using namespace std; // Node containing the// left and right child of// current node and the key valuestruct Node{    int data;    Node *left, *right;}; /* Utility that allocates anew node with the given key andNULL left and right pointers. */struct Node* newnode(int data){    struct Node* node = new (struct Node);    node->data = data;    node->left = node->right = NULL;    return (node);} // Variable to keep the track// of visible nodesint countNode = 0; // Function to perform the preorder traversal// for the given treevoid preOrder(Node* node, int mx){    // Base case    if (node == NULL)    {        return;    }     // If the current node value is greater    // or equal to the max value,    // then update count variable    // and also update max variable    if (node->data >= mx)    {        countNode++;        mx = max(node->data, mx);    }     // Traverse to the left    preOrder(node->left, mx);     // Traverse to the right    preOrder(node->right, mx);} // Driver codeint main(){    struct Node* root = newnode(5);     /*            5           /  \         3     10        /  \   /       20   21 1*/     root->left = newnode(3);    root->right = newnode(10);       root->left->left = newnode(20);    root->left->right = newnode(21);     root->right->left = newnode(1);     preOrder(root, INT_MIN);     cout << countNode;} // This code is contributed by gauravrajput1
// Java implementation to count the// number of visible nodes in// the binary tree // Class containing the left and right// child of current node and the// key valueclass Node {    int data;    Node left, right;     // Constructor of the class    public Node(int item)    {        data = item;        left = right = null;    }} public class GFG {    Node root;     // Variable to keep the track    // of visible nodes    static int count;     // Function to perform the preorder traversal    // for the given tree    static void preOrder(Node node, int max)    {         // Base case        if (node == null) {            return;        }         // If the current node value is greater        // or equal to the max value,        // then update count variable        // and also update max variable        if (node.data >= max) {            count++;            max = Math.max(node.data, max);        }         // Traverse to the left        preOrder(node.left, max);         // Traverse to the right        preOrder(node.right, max);    }     // Driver code    public static void main(String[] args)    {        GFG tree = new GFG();         /*                5               /  \             3     10            /  \   /           20   21 1*/         tree.root = new Node(5);        tree.root.left = new Node(3);        tree.root.right = new Node(10);         tree.root.left.left = new Node(20);        tree.root.left.right = new Node(21);         tree.root.right.left = new Node(1);         count = 0;        preOrder(tree.root, Integer.MIN_VALUE);         System.out.println(count);    }}
# Python 3 implementation to# count the number of# visible nodes in the# binary tree import sys# Node containing the# left and right child of# current node and the key value class newNode:       def __init__(self, data):               self.data = data        self.left = None        self.right = None ''' Utility that allocates anew node with the given key andNone left and right pointers. */''' # Variable to keep the track# of visible nodescountNode = 0 # Function to perform the# preorder traversal for the# given treedef preOrder(node, mx):       global countNode         # Base case    if (node == None):        return     # If the current node value    # is greater or equal to the    # max value, then update count    # variable and also update max    # variable    if (node.data >= mx):        countNode += 1        mx = max(node.data, mx)     # Traverse to the left    preOrder(node.left, mx)     # Traverse to the right    preOrder(node.right, mx) # Driver codeif __name__ == '__main__':       root = newNode(5)     ''' /*            5           /  \         3     10        /  /   /       20   21 1    */    '''    root.left = newNode(3)    root.right = newNode(10)    root.left.left = newNode(20)    root.left.right = newNode(21)    root.right.left = newNode(1)    preOrder(root, -sys.maxsize-1)    print(countNode)     # This code is contributed by SURENDRA_GANGWAR
// C# implementation to count the// number of visible nodes in// the binary treeusing System; // Class containing the left and right// child of current node and the// key valueclass Node{    public int data;    public Node left, right;     // Constructor of the class    public Node(int item)    {        data = item;        left = right = null;    }} class GFG{     Node root; // Variable to keep the track// of visible nodesstatic int count; // Function to perform the preorder// traversal for the given treestatic void preOrder(Node node, int max){     // Base case    if (node == null)    {        return;    }     // If the current node value is greater    // or equal to the max value,    // then update count variable    // and also update max variable    if (node.data >= max)    {        count++;        max = Math.Max(node.data, max);    }     // Traverse to the left    preOrder(node.left, max);     // Traverse to the right    preOrder(node.right, max);} // Driver codestatic public void Main(String[] args){    GFG tree = new GFG(); /*         5        / \      3       10     / \   /    20 21 1*/     tree.root = new Node(5);    tree.root.left = new Node(3);    tree.root.right = new Node(10);     tree.root.left.left = new Node(20);    tree.root.left.right = new Node(21);    tree.root.right.left = new Node(1);     count = 0;    preOrder(tree.root, int.MinValue);    Console.WriteLine(count);}} // This code is contributed by Amit Katiyar
<script>    // Javascript implementation to count the    // number of visible nodes in the binary tree         // Class containing the left and right    // child of current node and the    // key value    class Node    {       constructor(item) {           this.left = null;           this.right = null;           this.data = item;        }    }         let root;      // Variable to keep the track    // of visible nodes    let count;      // Function to perform the preorder traversal    // for the given tree    function preOrder(node, max)    {          // Base case        if (node == null) {            return;        }          // If the current node value is greater        // or equal to the max value,        // then update count variable        // and also update max variable        if (node.data >= max) {            count++;            max = Math.max(node.data, max);        }          // Traverse to the left        preOrder(node.left, max);          // Traverse to the right        preOrder(node.right, max);    }      /*                  5                 /  \               3     10              /  \   /             20   21 1      */     root = new Node(5);    root.left = new Node(3);    root.right = new Node(10);     root.left.left = new Node(20);    root.left.right = new Node(21);     root.right.left = new Node(1);     count = 0;    preOrder(root, Number.MIN_VALUE);     document.write(count);   // This code is contributed by rameshtravel07.</script>
4
 
Complexity Analysis: Time Complexity: O(N) where N is a number of nodes in the Binary tree. Auxiliary Space: O(H) where H is the height of the Binary tree. 
amit143katiyar
GauravRajput1
SURENDRA_GANGWAR
rameshtravel07
Binary Tree
Microsoft
Tree
Microsoft
Tree
Writing code in comment?
Please use ide.geeksforgeeks.org,
generate link and share the link here.
Comments
Old Comments
Introduction to Tree Data Structure
DFS traversal of a tree using recursion
Threaded Binary Tree
Find maximum (or minimum) in Binary Tree
Iterative Postorder Traversal | Set 2 (Using One Stack)
Find the node with minimum value in a Binary Search Tree
Top 50 Tree Coding Problems for Interviews
Maximum Path Sum in a Binary Tree
Construct Complete Binary Tree from its Linked List Representation
Iterative Preorder Traversal