Check if a Binary Tree (not BST) has duplicate values

Check if a Binary Tree (not BST) has duplicate values

Examples:

Input : Root of below tree
         1
       /   \
      2     3
             \
              2
Output : Yes
Explanation : The duplicate value is 2.

Input : Root of below tree
         1
       /   \
     20     3
             \
              4
Output : No
Explanation : There are no duplicates.

A simple solution is to store inorder traversal of given binary tree in an array. Then check if array has duplicates or not. We can avoid the use of array and solve the problem in O(n) time. The idea is to use hashing. We traverse the given tree, for every node, we check if it already exists in hash table. If exists, we return true (found duplicate). If it does not exist, we insert into hash table.



C++

filter_none

edit
close

play_arrow

link
brightness_4
code

// C++ Program to check duplicates
// in Binary Tree
#include <bits/stdc++.h>
using namespace std;
  
// A binary tree Node has data,
// pointer to left child
// and a pointer to right child
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 = node->right = NULL;
    return (node);
}
  
bool checkDupUtil(Node* root, unordered_set<int> &s)
{
    // If tree is empty, there are no
    // duplicates. 
    if (root == NULL)
       return false;
  
    // If current node's data is already present.
    if (s.find(root->data) != s.end())
       return true;
  
    // Insert current node
    s.insert(root->data);
      
    // Recursively check in left and right
    // subtrees.
    return checkDupUtil(root->left, s) || 
           checkDupUtil(root->right, s);
}
  
// To check if tree has duplicates
bool checkDup(struct Node* root)
{
    unordered_set<int> s;
    return checkDupUtil(root, s);
}
  
// Driver program to test above functions
int main()
{
    struct Node* root = newNode(1);
    root->left = newNode(2);
    root->right = newNode(2);
    root->left->left = newNode(3);
    if (checkDup(root))
        printf("Yes");
    else
        printf("No");
  
    return 0;
}

chevron_right


Java

filter_none

edit
close

play_arrow

link
brightness_4
code

// Java Program to check duplicates 
// in Binary Tree 
import java.util.HashSet;
public class CheckDuplicateValues {
  
    //Function that used HashSet to find presence of duplicate nodes
    public static boolean checkDupUtil(Node root, HashSet<Integer> s) 
    
        // If tree is empty, there are no 
        // duplicates.  
        if (root == null
            return false
    
        // If current node's data is already present. 
        if (s.contains(root.data)) 
            return true
    
        // Insert current node 
        s.add(root.data); 
        
        // Recursively check in left and right 
        // subtrees. 
        return checkDupUtil(root.left, s) || checkDupUtil(root.right, s); 
    
    
    // To check if tree has duplicates 
    public static boolean checkDup(Node root) 
    
        HashSet<Integer> s=new HashSet<>();
        return checkDupUtil(root, s); 
    
  
    public static void main(String args[]) {
        Node root = new Node(1); 
        root.left = new Node(2); 
        root.right = new Node(2); 
        root.left.left = new Node(3); 
        if (checkDup(root)) 
            System.out.print("Yes"); 
        else
            System.out.print("No"); 
    }
}
  
// A binary tree Node has data, 
// pointer to left child 
// and a pointer to right child 
class Node { 
    int data; 
    Node left,right; 
    Node(int data)
    {
        this.data=data;
    }
};
//This code is contributed by Gaurav Tiwari

chevron_right


Python

filter_none

edit
close

play_arrow

link
brightness_4
code

""" Program to check duplicates 
# in Binary Tree """
  
# Helper function that allocates a new 
# node with the given data and None 
# left and right poers.                                 
class newNode: 
  
    # Construct to create a new node 
    def __init__(self, key): 
        self.data = key
        self.left = None
        self.right = None
  
def checkDupUtil( root, s) :
  
    # If tree is empty, there are no 
    # duplicates. 
    if (root == None) :
        return False
  
    # If current node's data is already present. 
    if root.data in s: 
        return True
  
    # Insert current node 
    s.add(root.data) 
      
    # Recursively check in left and right 
    # subtrees. 
    return checkDupUtil(root.left, s) or checkDupUtil(root.right, s) 
  
  
# To check if tree has duplicates 
def checkDup( root) :
  
    s=set() 
    return checkDupUtil(root, s) 
  
  
# Driver Code 
if __name__ == '__main__':
    root = newNode(1
    root.left = newNode(2
    root.right = newNode(2
    root.left.left = newNode(3
    if (checkDup(root)):
        print("Yes")
    else:
        print("No")
  
# This code is contributed by
# Shubham Singh(SHUBHAMSINGH10)

chevron_right


C#

filter_none

edit
close

play_arrow

link
brightness_4
code

// C# Program to check duplicates 
// in Binary Tree 
using System;
using System.Collections;
using System.Collections.Generic; 
  
class CheckDuplicateValues
{
  
    //Function that used HashSet to 
    // find presence of duplicate nodes
    public static Boolean checkDupUtil(Node root, HashSet<int> s) 
    
        // If tree is empty, there are no 
        // duplicates. 
        if (root == null
            return false
      
        // If current node's data is already present. 
        if (s.Contains(root.data)) 
            return true
      
        // Insert current node 
        s.Add(root.data); 
          
        // Recursively check in left and right 
        // subtrees. 
        return checkDupUtil(root.left, s) || 
                checkDupUtil(root.right, s); 
    
      
    // To check if tree has duplicates 
    public static Boolean checkDup(Node root) 
    
        HashSet<int> s = new HashSet<int>();
        return checkDupUtil(root, s); 
    
  
    public static void Main(String []args) 
    {
        Node root = new Node(1); 
        root.left = new Node(2); 
        root.right = new Node(2); 
        root.left.left = new Node(3); 
        if (checkDup(root)) 
            Console.Write("Yes"); 
        else
            Console.Write("No"); 
    }
}
  
// A binary tree Node has data, 
// pointer to left child 
// and a pointer to right child 
public class Node
    public int data; 
    public Node left, right; 
    public Node(int data)
    {
        this.data = data;
    }
};
  
// This code is contributed by Arnab Kundu

chevron_right



Output:

Yes


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.